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 /* allocate an address and size stack for sorter(s) */ 24827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 2552f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK]; 26827bd09bSSatish Balay 277b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 28ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n) 29827bd09bSSatish Balay { 302fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 31827bd09bSSatish Balay return(arg1); 32827bd09bSSatish Balay } 33827bd09bSSatish Balay 347b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 35ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n) 36827bd09bSSatish Balay { 373fdc5746SBarry Smith PetscFunctionBegin; 382fa5cd67SKarl Rupp while (n--) *arg1++ = 0; 393fdc5746SBarry Smith PetscFunctionReturn(0); 40827bd09bSSatish Balay } 41827bd09bSSatish Balay 427b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 43ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n) 44827bd09bSSatish Balay { 453fdc5746SBarry Smith PetscFunctionBegin; 462fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 473fdc5746SBarry Smith PetscFunctionReturn(0); 48827bd09bSSatish Balay } 49827bd09bSSatish Balay 507b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 51ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_max(PetscInt *arg1, PetscInt *arg2, PetscInt n) 52827bd09bSSatish Balay { 533fdc5746SBarry Smith PetscFunctionBegin; 5439945688SSatish Balay while (n--) { *arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++; } 553fdc5746SBarry Smith PetscFunctionReturn(0); 56827bd09bSSatish Balay } 57827bd09bSSatish Balay 587b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 59ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1, PetscInt *arg2, PetscInt n) 60827bd09bSSatish Balay { 613fdc5746SBarry Smith PetscFunctionBegin; 622fa5cd67SKarl Rupp while (n--) { 632fa5cd67SKarl Rupp *(arg1) = PetscMin(*arg1,*arg2); 642fa5cd67SKarl Rupp arg1++; 652fa5cd67SKarl Rupp arg2++; 662fa5cd67SKarl Rupp } 673fdc5746SBarry Smith PetscFunctionReturn(0); 68827bd09bSSatish Balay } 69827bd09bSSatish Balay 707b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 71ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1, PetscInt *arg2, PetscInt n) 72827bd09bSSatish Balay { 733fdc5746SBarry Smith PetscFunctionBegin; 742fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 753fdc5746SBarry Smith PetscFunctionReturn(0); 76827bd09bSSatish Balay } 77827bd09bSSatish Balay 787b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 79ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1, PetscInt *arg2, PetscInt n) 80827bd09bSSatish Balay { 813fdc5746SBarry Smith PetscFunctionBegin; 822fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 833fdc5746SBarry Smith PetscFunctionReturn(0); 84827bd09bSSatish Balay } 85827bd09bSSatish Balay 867b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 87ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 88827bd09bSSatish Balay { 893fdc5746SBarry Smith PetscFunctionBegin; 902fa5cd67SKarl Rupp while (n--) { 912fa5cd67SKarl Rupp *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); 922fa5cd67SKarl Rupp arg1++; 932fa5cd67SKarl Rupp arg2++; 942fa5cd67SKarl Rupp } 953fdc5746SBarry Smith PetscFunctionReturn(0); 96827bd09bSSatish Balay } 97827bd09bSSatish Balay 987b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 99ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 100827bd09bSSatish Balay { 1013fdc5746SBarry Smith PetscFunctionBegin; 1022fa5cd67SKarl Rupp while (n--) *arg1++ ^= *arg2++; 1033fdc5746SBarry Smith PetscFunctionReturn(0); 104827bd09bSSatish Balay } 105827bd09bSSatish Balay 1067b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 107ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1, PetscInt *arg2, PetscInt n) 108827bd09bSSatish Balay { 1093fdc5746SBarry Smith PetscFunctionBegin; 1102fa5cd67SKarl Rupp while (n--) *arg1++ |= *arg2++; 1113fdc5746SBarry Smith PetscFunctionReturn(0); 112827bd09bSSatish Balay } 113827bd09bSSatish Balay 1147b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 115ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 116827bd09bSSatish Balay { 1173fdc5746SBarry Smith PetscFunctionBegin; 1182fa5cd67SKarl Rupp while (n--) { 1192fa5cd67SKarl Rupp *arg1 = (*arg1 || *arg2); 1202fa5cd67SKarl Rupp arg1++; 1212fa5cd67SKarl Rupp arg2++; 1222fa5cd67SKarl Rupp } 1233fdc5746SBarry Smith PetscFunctionReturn(0); 124827bd09bSSatish Balay } 125827bd09bSSatish Balay 1267b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 127ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1, PetscInt *arg2, PetscInt n) 128827bd09bSSatish Balay { 1293fdc5746SBarry Smith PetscFunctionBegin; 1302fa5cd67SKarl Rupp while (n--) *arg1++ &= *arg2++; 1313fdc5746SBarry Smith PetscFunctionReturn(0); 132827bd09bSSatish Balay } 133827bd09bSSatish Balay 1347b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 135ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1, PetscInt *arg2, PetscInt n) 136827bd09bSSatish Balay { 1373fdc5746SBarry Smith PetscFunctionBegin; 1382fa5cd67SKarl Rupp while (n--) { 1392fa5cd67SKarl Rupp *arg1 = (*arg1 && *arg2); 1402fa5cd67SKarl Rupp arg1++; 1412fa5cd67SKarl Rupp arg2++; 1422fa5cd67SKarl Rupp } 1433fdc5746SBarry Smith PetscFunctionReturn(0); 144827bd09bSSatish Balay } 145827bd09bSSatish Balay 1467b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 147ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 148827bd09bSSatish Balay { 1493fdc5746SBarry Smith PetscFunctionBegin; 1502fa5cd67SKarl Rupp while (n--) *arg1++ = (*arg2++ & *arg3++); 1513fdc5746SBarry Smith PetscFunctionReturn(0); 152827bd09bSSatish Balay } 153827bd09bSSatish Balay 1547b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 155ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1, PetscInt n) 156827bd09bSSatish Balay { 15752f87cdaSBarry Smith PetscInt tmp = 0; 1582fa5cd67SKarl Rupp while (n--) tmp += *arg1++; 159827bd09bSSatish Balay return(tmp); 160827bd09bSSatish Balay } 161827bd09bSSatish Balay 1627b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 163*6ae68b59SBarry Smith PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, ...) 164827bd09bSSatish Balay { 16552f87cdaSBarry Smith PetscInt i, j, type; 166*6ae68b59SBarry Smith PetscInt *arg3; 167*6ae68b59SBarry Smith va_list ap; 168827bd09bSSatish Balay 1693fdc5746SBarry Smith PetscFunctionBegin; 170*6ae68b59SBarry Smith va_start(ap, n); 171*6ae68b59SBarry Smith arg3 = va_arg(ap, PetscInt*); 172*6ae68b59SBarry Smith va_end(ap); 173*6ae68b59SBarry Smith 174827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 175db4deed7SKarl Rupp for (i=0; i<n;) { 176827bd09bSSatish Balay /* clump 'em for now */ 177827bd09bSSatish Balay j =i+1; 178827bd09bSSatish Balay type = arg3[i]; 1792fa5cd67SKarl Rupp while ((j<n)&&(arg3[j]==type)) j++; 180827bd09bSSatish Balay 181827bd09bSSatish Balay /* how many together */ 182827bd09bSSatish Balay j -= i; 183827bd09bSSatish Balay 184827bd09bSSatish Balay /* call appropriate ivec function */ 1852fa5cd67SKarl Rupp if (type == GL_MAX) PCTFS_ivec_max(arg1,arg2,j); 1862fa5cd67SKarl Rupp else if (type == GL_MIN) PCTFS_ivec_min(arg1,arg2,j); 1872fa5cd67SKarl Rupp else if (type == GL_MULT) PCTFS_ivec_mult(arg1,arg2,j); 1882fa5cd67SKarl Rupp else if (type == GL_ADD) PCTFS_ivec_add(arg1,arg2,j); 1892fa5cd67SKarl Rupp else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j); 1902fa5cd67SKarl Rupp else if (type == GL_B_OR) PCTFS_ivec_or(arg1,arg2,j); 1912fa5cd67SKarl Rupp else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j); 1922fa5cd67SKarl Rupp else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j); 1932fa5cd67SKarl Rupp else if (type == GL_L_OR) PCTFS_ivec_lor(arg1,arg2,j); 1942fa5cd67SKarl Rupp else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j); 195db4deed7SKarl Rupp else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_ivec_non_uniform()!"); 196827bd09bSSatish Balay 197827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 198827bd09bSSatish Balay } 1993fdc5746SBarry Smith PetscFunctionReturn(0); 200827bd09bSSatish Balay } 201827bd09bSSatish Balay 2027b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 203ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type) 204827bd09bSSatish Balay { 2052fa5cd67SKarl Rupp if (type == NON_UNIFORM) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform); 2062fa5cd67SKarl Rupp else if (type == GL_MAX) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max); 2072fa5cd67SKarl Rupp else if (type == GL_MIN) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min); 2082fa5cd67SKarl Rupp else if (type == GL_MULT) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult); 2092fa5cd67SKarl Rupp else if (type == GL_ADD) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add); 2102fa5cd67SKarl Rupp else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor); 2112fa5cd67SKarl Rupp else if (type == GL_B_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or); 2122fa5cd67SKarl Rupp else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and); 2132fa5cd67SKarl Rupp else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor); 2142fa5cd67SKarl Rupp else if (type == GL_L_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor); 2152fa5cd67SKarl Rupp else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land); 216827bd09bSSatish Balay 217827bd09bSSatish Balay /* catch all ... not good if we get here */ 218827bd09bSSatish Balay return(NULL); 219827bd09bSSatish Balay } 220827bd09bSSatish Balay 2217b1ae94cSBarry Smith /******************************************************************************/ 222ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar, PetscInt size) 223827bd09bSSatish Balay { 22452f87cdaSBarry Smith PetscInt *pi, *pj, temp; 22552f87cdaSBarry Smith PetscInt **top_a = (PetscInt**) offset_stack; 22652f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 227827bd09bSSatish Balay 228b458e8f1SJose E. Roman PetscFunctionBegin; 229827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 230827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 231827bd09bSSatish Balay size--; 232827bd09bSSatish Balay 233827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 234db4deed7SKarl Rupp for (;;) { 235827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 236db4deed7SKarl Rupp if (size > SORT_OPT) { 237827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 238827bd09bSSatish Balay pi = ar+1; 239827bd09bSSatish Balay pj = ar+size; 240827bd09bSSatish Balay 241827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 242827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 243827bd09bSSatish Balay 244827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 245827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 246db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) } 247db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) } 248db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) } 249827bd09bSSatish Balay 250827bd09bSSatish Balay /* partition about pivot_value ... */ 251827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 252db4deed7SKarl Rupp for (;;) { 253827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 254827bd09bSSatish Balay do pi++; while (*pi<*ar); 255827bd09bSSatish Balay do pj--; while (*pj>*ar); 256827bd09bSSatish Balay 257827bd09bSSatish Balay /* if we've crossed we're done */ 258827bd09bSSatish Balay if (pj<pi) break; 259827bd09bSSatish Balay 260827bd09bSSatish Balay /* else swap */ 261827bd09bSSatish Balay SWAP(*pi,*pj) 262827bd09bSSatish Balay } 263827bd09bSSatish Balay 264827bd09bSSatish Balay /* place pivot_value in it's correct location */ 265827bd09bSSatish Balay SWAP(*ar,*pj) 266827bd09bSSatish Balay 267827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 268ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!"); 269827bd09bSSatish Balay 270827bd09bSSatish Balay /* push right hand child iff length > 1 */ 271db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 272827bd09bSSatish Balay *(top_a++) = pi; 273827bd09bSSatish Balay size -= *top_s+2; 274827bd09bSSatish Balay top_s++; 2752fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 276db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 277827bd09bSSatish Balay ar = *(--top_a); 278827bd09bSSatish Balay size = *(--top_s); 279827bd09bSSatish Balay } 280db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 281827bd09bSSatish Balay 282827bd09bSSatish Balay /* insertion sort for bottom */ 283db4deed7SKarl Rupp for (pj=ar+1; pj<=ar+size; pj++) { 284827bd09bSSatish Balay temp = *pj; 285db4deed7SKarl Rupp for (pi=pj-1; pi>=ar; pi--) { 286827bd09bSSatish Balay if (*pi <= temp) break; 287827bd09bSSatish Balay *(pi+1)=*pi; 288827bd09bSSatish Balay } 289827bd09bSSatish Balay *(pi+1)=temp; 290827bd09bSSatish Balay } 291827bd09bSSatish Balay 292827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 2933fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 294827bd09bSSatish Balay 295827bd09bSSatish Balay /* else pop another list from the stack */ 296827bd09bSSatish Balay ar = *(--top_a); 297827bd09bSSatish Balay size = *(--top_s); 298827bd09bSSatish Balay } 299827bd09bSSatish Balay } 300827bd09bSSatish Balay } 301827bd09bSSatish Balay 3027b1ae94cSBarry Smith /******************************************************************************/ 303ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar, PetscInt *ar2, PetscInt size) 304827bd09bSSatish Balay { 30552f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 30652f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 30752f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 30852f87cdaSBarry Smith PetscInt *pi2, *pj2; 30952f87cdaSBarry Smith PetscInt mid; 310827bd09bSSatish Balay 3113fdc5746SBarry Smith PetscFunctionBegin; 312827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 313827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 314827bd09bSSatish Balay size--; 315827bd09bSSatish Balay 316827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 317db4deed7SKarl Rupp for (;;) { 318db4deed7SKarl Rupp 319827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 320db4deed7SKarl Rupp if (size > SORT_OPT) { 321db4deed7SKarl Rupp 322827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 323827bd09bSSatish Balay mid = size>>1; 324827bd09bSSatish Balay pi = ar+1; 325827bd09bSSatish Balay pj = ar+mid; 326827bd09bSSatish Balay pi2 = ar2+1; 327827bd09bSSatish Balay pj2 = ar2+mid; 328827bd09bSSatish Balay 329827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 330827bd09bSSatish Balay SWAP(*pi,*pj) 331827bd09bSSatish Balay SWAP(*pi2,*pj2) 332827bd09bSSatish Balay 333827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 334827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 335827bd09bSSatish Balay pj = ar+size; 336827bd09bSSatish Balay pj2 = ar2+size; 337db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) } 338db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) } 339db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) } 340827bd09bSSatish Balay 341827bd09bSSatish Balay /* partition about pivot_value ... */ 342827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 343db4deed7SKarl Rupp for (;;) { 344827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 345827bd09bSSatish Balay do { pi++; pi2++; } while (*pi<*ar); 346827bd09bSSatish Balay do { pj--; pj2--; } while (*pj>*ar); 347827bd09bSSatish Balay 348827bd09bSSatish Balay /* if we've crossed we're done */ 349827bd09bSSatish Balay if (pj<pi) break; 350827bd09bSSatish Balay 351827bd09bSSatish Balay /* else swap */ 352827bd09bSSatish Balay SWAP(*pi,*pj) 353827bd09bSSatish Balay SWAP(*pi2,*pj2) 354827bd09bSSatish Balay } 355827bd09bSSatish Balay 356827bd09bSSatish Balay /* place pivot_value in it's correct location */ 357827bd09bSSatish Balay SWAP(*ar,*pj) 358827bd09bSSatish Balay SWAP(*ar2,*pj2) 359827bd09bSSatish Balay 360827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 361ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!"); 362827bd09bSSatish Balay 363827bd09bSSatish Balay /* push right hand child iff length > 1 */ 364db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 365827bd09bSSatish Balay *(top_a++) = pi; 366827bd09bSSatish Balay *(top_a++) = pi2; 367827bd09bSSatish Balay size -= *top_s+2; 368827bd09bSSatish Balay top_s++; 3692fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 370db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 371827bd09bSSatish Balay ar2 = *(--top_a); 372827bd09bSSatish Balay ar = *(--top_a); 373827bd09bSSatish Balay size = *(--top_s); 374827bd09bSSatish Balay } 375db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 376827bd09bSSatish Balay 377827bd09bSSatish Balay /* insertion sort for bottom */ 378db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 379827bd09bSSatish Balay temp = *pj; 380827bd09bSSatish Balay temp2 = *pj2; 381db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 382827bd09bSSatish Balay if (*pi <= temp) break; 383827bd09bSSatish Balay *(pi+1) =*pi; 384827bd09bSSatish Balay *(pi2+1)=*pi2; 385827bd09bSSatish Balay } 386827bd09bSSatish Balay *(pi+1) =temp; 387827bd09bSSatish Balay *(pi2+1)=temp2; 388827bd09bSSatish Balay } 389827bd09bSSatish Balay 390827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3913fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 392827bd09bSSatish Balay 393827bd09bSSatish Balay /* else pop another list from the stack */ 394827bd09bSSatish Balay ar2 = *(--top_a); 395827bd09bSSatish Balay ar = *(--top_a); 396827bd09bSSatish Balay size = *(--top_s); 397827bd09bSSatish Balay } 398827bd09bSSatish Balay } 399827bd09bSSatish Balay } 400827bd09bSSatish Balay 4017b1ae94cSBarry Smith /******************************************************************************/ 402ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar, PetscInt **ar2, PetscInt size) 403827bd09bSSatish Balay { 40452f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 40552f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 40652f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 40752f87cdaSBarry Smith PetscInt **pi2, **pj2; 40852f87cdaSBarry Smith PetscInt mid; 409827bd09bSSatish Balay 4103fdc5746SBarry Smith PetscFunctionBegin; 411827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 412827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 413827bd09bSSatish Balay size--; 414827bd09bSSatish Balay 415827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 416db4deed7SKarl Rupp for (;;) { 417db4deed7SKarl Rupp 418827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 419db4deed7SKarl Rupp if (size > SORT_OPT) { 420db4deed7SKarl Rupp 421827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 422827bd09bSSatish Balay mid = size>>1; 423827bd09bSSatish Balay pi = ar+1; 424827bd09bSSatish Balay pj = ar+mid; 425827bd09bSSatish Balay pi2 = ar2+1; 426827bd09bSSatish Balay pj2 = ar2+mid; 427827bd09bSSatish Balay 428827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 429827bd09bSSatish Balay SWAP(*pi,*pj) 430827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 431827bd09bSSatish Balay 432827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 433827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 434827bd09bSSatish Balay pj = ar+size; 435827bd09bSSatish Balay pj2 = ar2+size; 436db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) } 437db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) } 438db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) } 439827bd09bSSatish Balay 440827bd09bSSatish Balay /* partition about pivot_value ... */ 441827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 442db4deed7SKarl Rupp for (;;) { 443db4deed7SKarl Rupp 444827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 445827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 446827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 447827bd09bSSatish Balay 448827bd09bSSatish Balay /* if we've crossed we're done */ 449827bd09bSSatish Balay if (pj<pi) break; 450827bd09bSSatish Balay 451827bd09bSSatish Balay /* else swap */ 452827bd09bSSatish Balay SWAP(*pi,*pj) 453827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 454827bd09bSSatish Balay } 455827bd09bSSatish Balay 456827bd09bSSatish Balay /* place pivot_value in it's correct location */ 457827bd09bSSatish Balay SWAP(*ar,*pj) 458827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 459827bd09bSSatish Balay 460827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 461ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 462827bd09bSSatish Balay 463827bd09bSSatish Balay /* push right hand child iff length > 1 */ 464db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 465827bd09bSSatish Balay *(top_a++) = pi; 46652f87cdaSBarry Smith *(top_a++) = (PetscInt*) pi2; 467827bd09bSSatish Balay size -= *top_s+2; 468827bd09bSSatish Balay top_s++; 4692fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 470db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 47152f87cdaSBarry Smith ar2 = (PetscInt**) *(--top_a); 472827bd09bSSatish Balay ar = *(--top_a); 473827bd09bSSatish Balay size = *(--top_s); 474827bd09bSSatish Balay } 4752fa5cd67SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 476827bd09bSSatish Balay /* insertion sort for bottom */ 477db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 478827bd09bSSatish Balay temp = *pj; 479827bd09bSSatish Balay ptr = *pj2; 480db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 481827bd09bSSatish Balay if (*pi <= temp) break; 482827bd09bSSatish Balay *(pi+1) =*pi; 483827bd09bSSatish Balay *(pi2+1)=*pi2; 484827bd09bSSatish Balay } 485827bd09bSSatish Balay *(pi+1) =temp; 486827bd09bSSatish Balay *(pi2+1)=ptr; 487827bd09bSSatish Balay } 488827bd09bSSatish Balay 489827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4903fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 491827bd09bSSatish Balay 492827bd09bSSatish Balay /* else pop another list from the stack */ 49352f87cdaSBarry Smith ar2 = (PetscInt**)*(--top_a); 494827bd09bSSatish Balay ar = *(--top_a); 495827bd09bSSatish Balay size = *(--top_s); 496827bd09bSSatish Balay } 497827bd09bSSatish Balay } 498827bd09bSSatish Balay } 499827bd09bSSatish Balay 5007b1ae94cSBarry Smith /******************************************************************************/ 501ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 502827bd09bSSatish Balay { 5033fdc5746SBarry Smith PetscFunctionBegin; 504e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 505ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size); 506ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 507e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 508ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size); 509ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 510ca8e9878SJed Brown } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!"); 5113fdc5746SBarry Smith PetscFunctionReturn(0); 512827bd09bSSatish Balay } 513827bd09bSSatish Balay 5147b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 515ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item, PetscInt *list, PetscInt n) 516827bd09bSSatish Balay { 51752f87cdaSBarry Smith PetscInt tmp = n-1; 5185fd66863SKarl Rupp 5192fa5cd67SKarl Rupp while (n--) { 5202fa5cd67SKarl Rupp if (*list++ == item) return(tmp-n); 5212fa5cd67SKarl Rupp } 522827bd09bSSatish Balay return(-1); 523827bd09bSSatish Balay } 524827bd09bSSatish Balay 5257b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 526ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search(PetscInt item, PetscInt *list, PetscInt rh) 527827bd09bSSatish Balay { 52852f87cdaSBarry Smith PetscInt mid, lh=0; 529827bd09bSSatish Balay 530827bd09bSSatish Balay rh--; 531db4deed7SKarl Rupp while (lh<=rh) { 532827bd09bSSatish Balay mid = (lh+rh)>>1; 5332fa5cd67SKarl Rupp if (*(list+mid) == item) return(mid); 5342fa5cd67SKarl Rupp if (*(list+mid) > item) rh = mid-1; 5352fa5cd67SKarl Rupp else lh = mid+1; 536827bd09bSSatish Balay } 537827bd09bSSatish Balay return(-1); 538827bd09bSSatish Balay } 539827bd09bSSatish Balay 5407b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 541ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 542827bd09bSSatish Balay { 5433fdc5746SBarry Smith PetscFunctionBegin; 5442fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 5453fdc5746SBarry Smith PetscFunctionReturn(0); 546827bd09bSSatish Balay } 547827bd09bSSatish Balay 5487b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 549ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1, PetscInt n) 550827bd09bSSatish Balay { 5513fdc5746SBarry Smith PetscFunctionBegin; 5522fa5cd67SKarl Rupp while (n--) *arg1++ = 0.0; 5533fdc5746SBarry Smith PetscFunctionReturn(0); 554827bd09bSSatish Balay } 555827bd09bSSatish Balay 5567b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 557ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1, PetscInt n) 558827bd09bSSatish Balay { 5593fdc5746SBarry Smith PetscFunctionBegin; 5602fa5cd67SKarl Rupp while (n--) *arg1++ = 1.0; 5613fdc5746SBarry Smith PetscFunctionReturn(0); 562827bd09bSSatish Balay } 563827bd09bSSatish Balay 5647b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 565ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 566827bd09bSSatish Balay { 5673fdc5746SBarry Smith PetscFunctionBegin; 5682fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 5693fdc5746SBarry Smith PetscFunctionReturn(0); 570827bd09bSSatish Balay } 571827bd09bSSatish Balay 5727b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 573ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 574827bd09bSSatish Balay { 5753fdc5746SBarry Smith PetscFunctionBegin; 5762fa5cd67SKarl Rupp while (n--) *arg1++ *= arg2; 5773fdc5746SBarry Smith PetscFunctionReturn(0); 578827bd09bSSatish Balay } 579827bd09bSSatish Balay 5807b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 581ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 582827bd09bSSatish Balay { 5833fdc5746SBarry Smith PetscFunctionBegin; 5842fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 5853fdc5746SBarry Smith PetscFunctionReturn(0); 586827bd09bSSatish Balay } 587827bd09bSSatish Balay 5887b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 589ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 590827bd09bSSatish Balay { 5913fdc5746SBarry Smith PetscFunctionBegin; 5922fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 5933fdc5746SBarry Smith PetscFunctionReturn(0); 594827bd09bSSatish Balay } 595827bd09bSSatish Balay 5967b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 597ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 598827bd09bSSatish Balay { 5993fdc5746SBarry Smith PetscFunctionBegin; 6002fa5cd67SKarl Rupp while (n--) { 6012fa5cd67SKarl Rupp *arg1 = PetscMax(*arg1,*arg2); 6022fa5cd67SKarl Rupp arg1++; 6032fa5cd67SKarl Rupp arg2++; 6042fa5cd67SKarl Rupp } 6053fdc5746SBarry Smith PetscFunctionReturn(0); 606827bd09bSSatish Balay } 607827bd09bSSatish Balay 6087b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 609ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 610827bd09bSSatish Balay { 6113fdc5746SBarry Smith PetscFunctionBegin; 6122fa5cd67SKarl Rupp while (n--) { 6132fa5cd67SKarl Rupp *arg1 = MAX_FABS(*arg1,*arg2); 6142fa5cd67SKarl Rupp arg1++; 6152fa5cd67SKarl Rupp arg2++; 6162fa5cd67SKarl Rupp } 6173fdc5746SBarry Smith PetscFunctionReturn(0); 618827bd09bSSatish Balay } 619827bd09bSSatish Balay 6207b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 621ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 622827bd09bSSatish Balay { 6233fdc5746SBarry Smith PetscFunctionBegin; 6242fa5cd67SKarl Rupp while (n--) { 6252fa5cd67SKarl Rupp *arg1 = PetscMin(*arg1,*arg2); 6262fa5cd67SKarl Rupp arg1++; 6272fa5cd67SKarl Rupp arg2++; 6282fa5cd67SKarl Rupp } 6293fdc5746SBarry Smith PetscFunctionReturn(0); 630827bd09bSSatish Balay } 631827bd09bSSatish Balay 6327b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 633ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 634827bd09bSSatish Balay { 6353fdc5746SBarry Smith PetscFunctionBegin; 6362fa5cd67SKarl Rupp while (n--) { 6372fa5cd67SKarl Rupp *arg1 = MIN_FABS(*arg1,*arg2); 6382fa5cd67SKarl Rupp arg1++; 6392fa5cd67SKarl Rupp arg2++; 6402fa5cd67SKarl Rupp } 6413fdc5746SBarry Smith PetscFunctionReturn(0); 642827bd09bSSatish Balay } 643827bd09bSSatish Balay 6447b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 645ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 646827bd09bSSatish Balay { 6473fdc5746SBarry Smith PetscFunctionBegin; 6482fa5cd67SKarl Rupp while (n--) { 6492fa5cd67SKarl Rupp *arg1 = EXISTS(*arg1,*arg2); 6502fa5cd67SKarl Rupp arg1++; 6512fa5cd67SKarl Rupp arg2++; 6522fa5cd67SKarl Rupp } 6533fdc5746SBarry Smith PetscFunctionReturn(0); 654827bd09bSSatish Balay } 655827bd09bSSatish Balay 6567b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 657ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3) 658827bd09bSSatish Balay { 65952f87cdaSBarry Smith PetscInt i, j, type; 660827bd09bSSatish Balay 6613fdc5746SBarry Smith PetscFunctionBegin; 662827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 663db4deed7SKarl Rupp for (i=0; i<n;) { 664db4deed7SKarl Rupp 665827bd09bSSatish Balay /* clump 'em for now */ 666827bd09bSSatish Balay j =i+1; 667827bd09bSSatish Balay type = arg3[i]; 6682fa5cd67SKarl Rupp while ((j<n)&&(arg3[j]==type)) j++; 669827bd09bSSatish Balay 670827bd09bSSatish Balay /* how many together */ 671827bd09bSSatish Balay j -= i; 672827bd09bSSatish Balay 673827bd09bSSatish Balay /* call appropriate ivec function */ 6742fa5cd67SKarl Rupp if (type == GL_MAX) PCTFS_rvec_max(arg1,arg2,j); 6752fa5cd67SKarl Rupp else if (type == GL_MIN) PCTFS_rvec_min(arg1,arg2,j); 6762fa5cd67SKarl Rupp else if (type == GL_MULT) PCTFS_rvec_mult(arg1,arg2,j); 6772fa5cd67SKarl Rupp else if (type == GL_ADD) PCTFS_rvec_add(arg1,arg2,j); 6782fa5cd67SKarl Rupp else if (type == GL_MAX_ABS) PCTFS_rvec_max_abs(arg1,arg2,j); 6792fa5cd67SKarl Rupp else if (type == GL_MIN_ABS) PCTFS_rvec_min_abs(arg1,arg2,j); 6802fa5cd67SKarl Rupp else if (type == GL_EXISTS) PCTFS_rvec_exists(arg1,arg2,j); 681ca8e9878SJed Brown else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!"); 682827bd09bSSatish Balay 683827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 684827bd09bSSatish Balay } 6853fdc5746SBarry Smith PetscFunctionReturn(0); 686827bd09bSSatish Balay } 687827bd09bSSatish Balay 6887b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 689ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr(PetscInt type) 690827bd09bSSatish Balay { 6912fa5cd67SKarl Rupp if (type == NON_UNIFORM) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_non_uniform); 6922fa5cd67SKarl Rupp else if (type == GL_MAX) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max); 6932fa5cd67SKarl Rupp else if (type == GL_MIN) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min); 6942fa5cd67SKarl Rupp else if (type == GL_MULT) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_mult); 6952fa5cd67SKarl Rupp else if (type == GL_ADD) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_add); 6962fa5cd67SKarl Rupp else if (type == GL_MAX_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max_abs); 6972fa5cd67SKarl Rupp else if (type == GL_MIN_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min_abs); 6982fa5cd67SKarl Rupp else if (type == GL_EXISTS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_exists); 699827bd09bSSatish Balay 700827bd09bSSatish Balay /* catch all ... not good if we get here */ 701827bd09bSSatish Balay return(NULL); 702827bd09bSSatish Balay } 703827bd09bSSatish Balay 704