1827bd09bSSatish Balay 2*9895aa37SBarry Smith 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 18c6db04a5SJed Brown #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*************************************/ 30ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n) 31827bd09bSSatish Balay { 322fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 33827bd09bSSatish Balay return(arg1); 34827bd09bSSatish Balay } 35827bd09bSSatish Balay 367b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 37ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n) 38827bd09bSSatish Balay { 393fdc5746SBarry Smith PetscFunctionBegin; 402fa5cd67SKarl Rupp while (n--) *arg1++ = 0; 413fdc5746SBarry Smith PetscFunctionReturn(0); 42827bd09bSSatish Balay } 43827bd09bSSatish Balay 447b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 45ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n) 46827bd09bSSatish Balay { 473fdc5746SBarry Smith PetscFunctionBegin; 482fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 493fdc5746SBarry Smith PetscFunctionReturn(0); 50827bd09bSSatish Balay } 51827bd09bSSatish Balay 527b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 53ca8e9878SJed Brown PetscErrorCode PCTFS_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*************************************/ 61ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1, PetscInt *arg2, PetscInt n) 62827bd09bSSatish Balay { 633fdc5746SBarry Smith PetscFunctionBegin; 642fa5cd67SKarl Rupp while (n--) { 652fa5cd67SKarl Rupp *(arg1) = PetscMin(*arg1,*arg2); 662fa5cd67SKarl Rupp arg1++; 672fa5cd67SKarl Rupp arg2++; 682fa5cd67SKarl Rupp } 693fdc5746SBarry Smith PetscFunctionReturn(0); 70827bd09bSSatish Balay } 71827bd09bSSatish Balay 727b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 73ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1, PetscInt *arg2, PetscInt n) 74827bd09bSSatish Balay { 753fdc5746SBarry Smith PetscFunctionBegin; 762fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 773fdc5746SBarry Smith PetscFunctionReturn(0); 78827bd09bSSatish Balay } 79827bd09bSSatish Balay 807b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 81ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1, PetscInt *arg2, PetscInt n) 82827bd09bSSatish Balay { 833fdc5746SBarry Smith PetscFunctionBegin; 842fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 853fdc5746SBarry Smith PetscFunctionReturn(0); 86827bd09bSSatish Balay } 87827bd09bSSatish Balay 887b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 89ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 90827bd09bSSatish Balay { 913fdc5746SBarry Smith PetscFunctionBegin; 922fa5cd67SKarl Rupp while (n--) { 932fa5cd67SKarl Rupp *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); 942fa5cd67SKarl Rupp arg1++; 952fa5cd67SKarl Rupp arg2++; 962fa5cd67SKarl Rupp } 973fdc5746SBarry Smith PetscFunctionReturn(0); 98827bd09bSSatish Balay } 99827bd09bSSatish Balay 1007b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 101ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 102827bd09bSSatish Balay { 1033fdc5746SBarry Smith PetscFunctionBegin; 1042fa5cd67SKarl Rupp while (n--) *arg1++ ^= *arg2++; 1053fdc5746SBarry Smith PetscFunctionReturn(0); 106827bd09bSSatish Balay } 107827bd09bSSatish Balay 1087b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 109ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1, PetscInt *arg2, PetscInt n) 110827bd09bSSatish Balay { 1113fdc5746SBarry Smith PetscFunctionBegin; 1122fa5cd67SKarl Rupp while (n--) *arg1++ |= *arg2++; 1133fdc5746SBarry Smith PetscFunctionReturn(0); 114827bd09bSSatish Balay } 115827bd09bSSatish Balay 1167b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 117ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 118827bd09bSSatish Balay { 1193fdc5746SBarry Smith PetscFunctionBegin; 1202fa5cd67SKarl Rupp while (n--) { 1212fa5cd67SKarl Rupp *arg1 = (*arg1 || *arg2); 1222fa5cd67SKarl Rupp arg1++; 1232fa5cd67SKarl Rupp arg2++; 1242fa5cd67SKarl Rupp } 1253fdc5746SBarry Smith PetscFunctionReturn(0); 126827bd09bSSatish Balay } 127827bd09bSSatish Balay 1287b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 129ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1, PetscInt *arg2, PetscInt n) 130827bd09bSSatish Balay { 1313fdc5746SBarry Smith PetscFunctionBegin; 1322fa5cd67SKarl Rupp while (n--) *arg1++ &= *arg2++; 1333fdc5746SBarry Smith PetscFunctionReturn(0); 134827bd09bSSatish Balay } 135827bd09bSSatish Balay 1367b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 137ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1, PetscInt *arg2, PetscInt n) 138827bd09bSSatish Balay { 1393fdc5746SBarry Smith PetscFunctionBegin; 1402fa5cd67SKarl Rupp while (n--) { 1412fa5cd67SKarl Rupp *arg1 = (*arg1 && *arg2); 1422fa5cd67SKarl Rupp arg1++; 1432fa5cd67SKarl Rupp arg2++; 1442fa5cd67SKarl Rupp } 1453fdc5746SBarry Smith PetscFunctionReturn(0); 146827bd09bSSatish Balay } 147827bd09bSSatish Balay 1487b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 149ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 150827bd09bSSatish Balay { 1513fdc5746SBarry Smith PetscFunctionBegin; 1522fa5cd67SKarl Rupp while (n--) *arg1++ = (*arg2++ & *arg3++); 1533fdc5746SBarry Smith PetscFunctionReturn(0); 154827bd09bSSatish Balay } 155827bd09bSSatish Balay 1567b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 157ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1, PetscInt n) 158827bd09bSSatish Balay { 15952f87cdaSBarry Smith PetscInt tmp = 0; 1602fa5cd67SKarl Rupp while (n--) tmp += *arg1++; 161827bd09bSSatish Balay return(tmp); 162827bd09bSSatish Balay } 163827bd09bSSatish Balay 1647b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 165ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, PetscInt *arg3) 166827bd09bSSatish Balay { 16752f87cdaSBarry Smith PetscInt i, j, type; 168827bd09bSSatish Balay 1693fdc5746SBarry Smith PetscFunctionBegin; 170827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 171db4deed7SKarl Rupp for (i=0; i<n; ) { 172827bd09bSSatish Balay /* clump 'em for now */ 173827bd09bSSatish Balay j =i+1; 174827bd09bSSatish Balay type = arg3[i]; 1752fa5cd67SKarl Rupp while ((j<n)&&(arg3[j]==type)) j++; 176827bd09bSSatish Balay 177827bd09bSSatish Balay /* how many together */ 178827bd09bSSatish Balay j -= i; 179827bd09bSSatish Balay 180827bd09bSSatish Balay /* call appropriate ivec function */ 1812fa5cd67SKarl Rupp if (type == GL_MAX) PCTFS_ivec_max(arg1,arg2,j); 1822fa5cd67SKarl Rupp else if (type == GL_MIN) PCTFS_ivec_min(arg1,arg2,j); 1832fa5cd67SKarl Rupp else if (type == GL_MULT) PCTFS_ivec_mult(arg1,arg2,j); 1842fa5cd67SKarl Rupp else if (type == GL_ADD) PCTFS_ivec_add(arg1,arg2,j); 1852fa5cd67SKarl Rupp else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j); 1862fa5cd67SKarl Rupp else if (type == GL_B_OR) PCTFS_ivec_or(arg1,arg2,j); 1872fa5cd67SKarl Rupp else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j); 1882fa5cd67SKarl Rupp else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j); 1892fa5cd67SKarl Rupp else if (type == GL_L_OR) PCTFS_ivec_lor(arg1,arg2,j); 1902fa5cd67SKarl Rupp else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j); 191db4deed7SKarl Rupp else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_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*************************************/ 199ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type) 200827bd09bSSatish Balay { 2012fa5cd67SKarl Rupp if (type == NON_UNIFORM) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform); 2022fa5cd67SKarl Rupp else if (type == GL_MAX) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max); 2032fa5cd67SKarl Rupp else if (type == GL_MIN) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min); 2042fa5cd67SKarl Rupp else if (type == GL_MULT) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult); 2052fa5cd67SKarl Rupp else if (type == GL_ADD) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add); 2062fa5cd67SKarl Rupp else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor); 2072fa5cd67SKarl Rupp else if (type == GL_B_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or); 2082fa5cd67SKarl Rupp else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and); 2092fa5cd67SKarl Rupp else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor); 2102fa5cd67SKarl Rupp else if (type == GL_L_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor); 2112fa5cd67SKarl Rupp else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land); 212827bd09bSSatish Balay 213827bd09bSSatish Balay /* catch all ... not good if we get here */ 214827bd09bSSatish Balay return(NULL); 215827bd09bSSatish Balay } 216827bd09bSSatish Balay 2177b1ae94cSBarry Smith /******************************************************************************/ 218ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar, PetscInt size) 219827bd09bSSatish Balay { 22052f87cdaSBarry Smith PetscInt *pi, *pj, temp; 22152f87cdaSBarry Smith PetscInt **top_a = (PetscInt**) offset_stack; 22252f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 223827bd09bSSatish Balay 224827bd09bSSatish Balay 225827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 226827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 227827bd09bSSatish Balay size--; 228827bd09bSSatish Balay 229827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 230db4deed7SKarl Rupp for (;; ) { 231827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 232db4deed7SKarl Rupp if (size > SORT_OPT) { 233827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 234827bd09bSSatish Balay pi = ar+1; 235827bd09bSSatish Balay pj = ar+size; 236827bd09bSSatish Balay 237827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 238827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 239827bd09bSSatish Balay 240827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 241827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 242db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) } 243db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) } 244db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) } 245827bd09bSSatish Balay 246827bd09bSSatish Balay /* partition about pivot_value ... */ 247827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 248db4deed7SKarl Rupp for (;; ) { 249827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 250827bd09bSSatish Balay do pi++; while (*pi<*ar); 251827bd09bSSatish Balay do pj--; while (*pj>*ar); 252827bd09bSSatish Balay 253827bd09bSSatish Balay /* if we've crossed we're done */ 254827bd09bSSatish Balay if (pj<pi) break; 255827bd09bSSatish Balay 256827bd09bSSatish Balay /* else swap */ 257827bd09bSSatish Balay SWAP(*pi,*pj) 258827bd09bSSatish Balay } 259827bd09bSSatish Balay 260827bd09bSSatish Balay /* place pivot_value in it's correct location */ 261827bd09bSSatish Balay SWAP(*ar,*pj) 262827bd09bSSatish Balay 263827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 264ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!"); 265827bd09bSSatish Balay 266827bd09bSSatish Balay /* push right hand child iff length > 1 */ 267db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 268827bd09bSSatish Balay *(top_a++) = pi; 269827bd09bSSatish Balay size -= *top_s+2; 270827bd09bSSatish Balay top_s++; 2712fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 272db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 273827bd09bSSatish Balay ar = *(--top_a); 274827bd09bSSatish Balay size = *(--top_s); 275827bd09bSSatish Balay } 276db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 277827bd09bSSatish Balay 278827bd09bSSatish Balay /* insertion sort for bottom */ 279db4deed7SKarl Rupp for (pj=ar+1; pj<=ar+size; pj++) { 280827bd09bSSatish Balay temp = *pj; 281db4deed7SKarl Rupp for (pi=pj-1; pi>=ar; pi--) { 282827bd09bSSatish Balay if (*pi <= temp) break; 283827bd09bSSatish Balay *(pi+1)=*pi; 284827bd09bSSatish Balay } 285827bd09bSSatish Balay *(pi+1)=temp; 286827bd09bSSatish Balay } 287827bd09bSSatish Balay 288827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 2893fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 290827bd09bSSatish Balay 291827bd09bSSatish Balay /* else pop another list from the stack */ 292827bd09bSSatish Balay ar = *(--top_a); 293827bd09bSSatish Balay size = *(--top_s); 294827bd09bSSatish Balay } 295827bd09bSSatish Balay } 2963fdc5746SBarry Smith PetscFunctionReturn(0); 297827bd09bSSatish Balay } 298827bd09bSSatish Balay 2997b1ae94cSBarry Smith /******************************************************************************/ 300ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar, PetscInt *ar2, PetscInt size) 301827bd09bSSatish Balay { 30252f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 30352f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 30452f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 30552f87cdaSBarry Smith PetscInt *pi2, *pj2; 30652f87cdaSBarry Smith PetscInt mid; 307827bd09bSSatish Balay 3083fdc5746SBarry Smith PetscFunctionBegin; 309827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 310827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 311827bd09bSSatish Balay size--; 312827bd09bSSatish Balay 313827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 314db4deed7SKarl Rupp for (;; ) { 315db4deed7SKarl Rupp 316827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 317db4deed7SKarl Rupp if (size > SORT_OPT) { 318db4deed7SKarl Rupp 319827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 320827bd09bSSatish Balay mid = size>>1; 321827bd09bSSatish Balay pi = ar+1; 322827bd09bSSatish Balay pj = ar+mid; 323827bd09bSSatish Balay pi2 = ar2+1; 324827bd09bSSatish Balay pj2 = ar2+mid; 325827bd09bSSatish Balay 326827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 327827bd09bSSatish Balay SWAP(*pi,*pj) 328827bd09bSSatish Balay SWAP(*pi2,*pj2) 329827bd09bSSatish Balay 330827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 331827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 332827bd09bSSatish Balay pj = ar+size; 333827bd09bSSatish Balay pj2 = ar2+size; 334db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) } 335db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) } 336db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) } 337827bd09bSSatish Balay 338827bd09bSSatish Balay /* partition about pivot_value ... */ 339827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 340db4deed7SKarl Rupp for (;; ) { 341827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 342827bd09bSSatish Balay do { pi++; pi2++; } while (*pi<*ar); 343827bd09bSSatish Balay do { pj--; pj2--; } while (*pj>*ar); 344827bd09bSSatish Balay 345827bd09bSSatish Balay /* if we've crossed we're done */ 346827bd09bSSatish Balay if (pj<pi) break; 347827bd09bSSatish Balay 348827bd09bSSatish Balay /* else swap */ 349827bd09bSSatish Balay SWAP(*pi,*pj) 350827bd09bSSatish Balay SWAP(*pi2,*pj2) 351827bd09bSSatish Balay } 352827bd09bSSatish Balay 353827bd09bSSatish Balay /* place pivot_value in it's correct location */ 354827bd09bSSatish Balay SWAP(*ar,*pj) 355827bd09bSSatish Balay SWAP(*ar2,*pj2) 356827bd09bSSatish Balay 357827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 358ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!"); 359827bd09bSSatish Balay 360827bd09bSSatish Balay /* push right hand child iff length > 1 */ 361db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 362827bd09bSSatish Balay *(top_a++) = pi; 363827bd09bSSatish Balay *(top_a++) = pi2; 364827bd09bSSatish Balay size -= *top_s+2; 365827bd09bSSatish Balay top_s++; 3662fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 367db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 368827bd09bSSatish Balay ar2 = *(--top_a); 369827bd09bSSatish Balay ar = *(--top_a); 370827bd09bSSatish Balay size = *(--top_s); 371827bd09bSSatish Balay } 372db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 373827bd09bSSatish Balay 374827bd09bSSatish Balay /* insertion sort for bottom */ 375db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 376827bd09bSSatish Balay temp = *pj; 377827bd09bSSatish Balay temp2 = *pj2; 378db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 379827bd09bSSatish Balay if (*pi <= temp) break; 380827bd09bSSatish Balay *(pi+1) =*pi; 381827bd09bSSatish Balay *(pi2+1)=*pi2; 382827bd09bSSatish Balay } 383827bd09bSSatish Balay *(pi+1) =temp; 384827bd09bSSatish Balay *(pi2+1)=temp2; 385827bd09bSSatish Balay } 386827bd09bSSatish Balay 387827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3883fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 389827bd09bSSatish Balay 390827bd09bSSatish Balay /* else pop another list from the stack */ 391827bd09bSSatish Balay ar2 = *(--top_a); 392827bd09bSSatish Balay ar = *(--top_a); 393827bd09bSSatish Balay size = *(--top_s); 394827bd09bSSatish Balay } 395827bd09bSSatish Balay } 3963fdc5746SBarry Smith PetscFunctionReturn(0); 397827bd09bSSatish Balay } 398827bd09bSSatish Balay 3997b1ae94cSBarry Smith /******************************************************************************/ 400ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar, PetscInt **ar2, PetscInt size) 401827bd09bSSatish Balay { 40252f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 40352f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 40452f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 40552f87cdaSBarry Smith PetscInt **pi2, **pj2; 40652f87cdaSBarry Smith PetscInt mid; 407827bd09bSSatish Balay 4083fdc5746SBarry Smith PetscFunctionBegin; 409827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 410827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 411827bd09bSSatish Balay size--; 412827bd09bSSatish Balay 413827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 414db4deed7SKarl Rupp for (;; ) { 415db4deed7SKarl Rupp 416827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 417db4deed7SKarl Rupp if (size > SORT_OPT) { 418db4deed7SKarl Rupp 419827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 420827bd09bSSatish Balay mid = size>>1; 421827bd09bSSatish Balay pi = ar+1; 422827bd09bSSatish Balay pj = ar+mid; 423827bd09bSSatish Balay pi2 = ar2+1; 424827bd09bSSatish Balay pj2 = ar2+mid; 425827bd09bSSatish Balay 426827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 427827bd09bSSatish Balay SWAP(*pi,*pj) 428827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 429827bd09bSSatish Balay 430827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 431827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 432827bd09bSSatish Balay pj = ar+size; 433827bd09bSSatish Balay pj2 = ar2+size; 434db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) } 435db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) } 436db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) } 437827bd09bSSatish Balay 438827bd09bSSatish Balay /* partition about pivot_value ... */ 439827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 440db4deed7SKarl Rupp for (;; ) { 441db4deed7SKarl Rupp 442827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 443827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 444827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 445827bd09bSSatish Balay 446827bd09bSSatish Balay /* if we've crossed we're done */ 447827bd09bSSatish Balay if (pj<pi) break; 448827bd09bSSatish Balay 449827bd09bSSatish Balay /* else swap */ 450827bd09bSSatish Balay SWAP(*pi,*pj) 451827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 452827bd09bSSatish Balay } 453827bd09bSSatish Balay 454827bd09bSSatish Balay /* place pivot_value in it's correct location */ 455827bd09bSSatish Balay SWAP(*ar,*pj) 456827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 457827bd09bSSatish Balay 458827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 459ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 460827bd09bSSatish Balay 461827bd09bSSatish Balay /* push right hand child iff length > 1 */ 462db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 463827bd09bSSatish Balay *(top_a++) = pi; 46452f87cdaSBarry Smith *(top_a++) = (PetscInt*) pi2; 465827bd09bSSatish Balay size -= *top_s+2; 466827bd09bSSatish Balay top_s++; 4672fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 468db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 46952f87cdaSBarry Smith ar2 = (PetscInt**) *(--top_a); 470827bd09bSSatish Balay ar = *(--top_a); 471827bd09bSSatish Balay size = *(--top_s); 472827bd09bSSatish Balay } 4732fa5cd67SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 474827bd09bSSatish Balay /* insertion sort for bottom */ 475db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 476827bd09bSSatish Balay temp = *pj; 477827bd09bSSatish Balay ptr = *pj2; 478db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 479827bd09bSSatish Balay if (*pi <= temp) break; 480827bd09bSSatish Balay *(pi+1) =*pi; 481827bd09bSSatish Balay *(pi2+1)=*pi2; 482827bd09bSSatish Balay } 483827bd09bSSatish Balay *(pi+1) =temp; 484827bd09bSSatish Balay *(pi2+1)=ptr; 485827bd09bSSatish Balay } 486827bd09bSSatish Balay 487827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4883fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 489827bd09bSSatish Balay 490827bd09bSSatish Balay /* else pop another list from the stack */ 49152f87cdaSBarry Smith ar2 = (PetscInt**)*(--top_a); 492827bd09bSSatish Balay ar = *(--top_a); 493827bd09bSSatish Balay size = *(--top_s); 494827bd09bSSatish Balay } 495827bd09bSSatish Balay } 4963fdc5746SBarry Smith PetscFunctionReturn(0); 497827bd09bSSatish Balay } 498827bd09bSSatish Balay 4997b1ae94cSBarry Smith /******************************************************************************/ 500ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 501827bd09bSSatish Balay { 5023fdc5746SBarry Smith PetscFunctionBegin; 503e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 504ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size); 505ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 506e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 507ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size); 508ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 509ca8e9878SJed Brown } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!"); 5103fdc5746SBarry Smith PetscFunctionReturn(0); 511827bd09bSSatish Balay } 512827bd09bSSatish Balay 5137b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 514ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item, PetscInt *list, PetscInt n) 515827bd09bSSatish Balay { 51652f87cdaSBarry Smith PetscInt tmp = n-1; 5175fd66863SKarl Rupp 5183fdc5746SBarry Smith PetscFunctionBegin; 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 704827bd09bSSatish Balay 705827bd09bSSatish Balay 706827bd09bSSatish Balay 707827bd09bSSatish Balay 708827bd09bSSatish Balay 709