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 17827bd09bSSatish Balay /**********************************ivec.c************************************** 18827bd09bSSatish Balay File Description: 19827bd09bSSatish Balay ----------------- 20827bd09bSSatish Balay 21827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2239945688SSatish Balay #include "petsc.h" 23827bd09bSSatish Balay #include <float.h> 24827bd09bSSatish Balay #include <limits.h> 25827bd09bSSatish Balay 26827bd09bSSatish Balay 27827bd09bSSatish Balay #include "const.h" 28827bd09bSSatish Balay #include "types.h" 29827bd09bSSatish Balay #include "ivec.h" 30827bd09bSSatish Balay #include "error.h" 31827bd09bSSatish Balay #include "comm.h" 32827bd09bSSatish Balay 33827bd09bSSatish Balay 34827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 35827bd09bSSatish Balay #define SORT_OPT 6 36827bd09bSSatish Balay #define SORT_STACK 50000 37827bd09bSSatish Balay 38827bd09bSSatish Balay 39827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 40827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 41827bd09bSSatish Balay static int size_stack[SORT_STACK]; 42*a501084fSBarry Smith static long psize_stack[SORT_STACK]; 43827bd09bSSatish Balay 44827bd09bSSatish Balay 45827bd09bSSatish Balay 46827bd09bSSatish Balay /**********************************ivec.c************************************** 47827bd09bSSatish Balay Function ivec_dump() 48827bd09bSSatish Balay 49827bd09bSSatish Balay Input : 50827bd09bSSatish Balay Output: 51827bd09bSSatish Balay Return: 52827bd09bSSatish Balay Description: 53827bd09bSSatish Balay ***********************************ivec.c*************************************/ 54827bd09bSSatish Balay void 55827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s) 56827bd09bSSatish Balay { 57827bd09bSSatish Balay int i; 58827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 59827bd09bSSatish Balay for (i=0;i<n;i++) 60827bd09bSSatish Balay {printf("%2d ",v[i]);} 61827bd09bSSatish Balay printf("\n"); 62827bd09bSSatish Balay fflush(stdout); 63827bd09bSSatish Balay } 64827bd09bSSatish Balay 65827bd09bSSatish Balay 66827bd09bSSatish Balay 67827bd09bSSatish Balay /**********************************ivec.c************************************** 68827bd09bSSatish Balay Function ivec_lb_ub() 69827bd09bSSatish Balay 70827bd09bSSatish Balay Input : 71827bd09bSSatish Balay Output: 72827bd09bSSatish Balay Return: 73827bd09bSSatish Balay Description: 74827bd09bSSatish Balay ***********************************ivec.c*************************************/ 75827bd09bSSatish Balay void 76*a501084fSBarry Smith ivec_lb_ub( int *arg1, int n, int *lb, int *ub) 77827bd09bSSatish Balay { 78*a501084fSBarry Smith int min = INT_MAX; 79*a501084fSBarry Smith int max = INT_MIN; 80827bd09bSSatish Balay 81827bd09bSSatish Balay while (n--) 82827bd09bSSatish Balay { 8339945688SSatish Balay min = PetscMin(min,*arg1); 8439945688SSatish Balay max = PetscMax(max,*arg1); 85827bd09bSSatish Balay arg1++; 86827bd09bSSatish Balay } 87827bd09bSSatish Balay 88827bd09bSSatish Balay *lb=min; 89827bd09bSSatish Balay *ub=max; 90827bd09bSSatish Balay } 91827bd09bSSatish Balay 92827bd09bSSatish Balay 93827bd09bSSatish Balay 94827bd09bSSatish Balay /**********************************ivec.c************************************** 95827bd09bSSatish Balay Function ivec_copy() 96827bd09bSSatish Balay 97827bd09bSSatish Balay Input : 98827bd09bSSatish Balay Output: 99827bd09bSSatish Balay Return: 100827bd09bSSatish Balay Description: 101827bd09bSSatish Balay ***********************************ivec.c*************************************/ 102*a501084fSBarry Smith int *ivec_copy( int *arg1, int *arg2, int n) 103827bd09bSSatish Balay { 104827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 105827bd09bSSatish Balay return(arg1); 106827bd09bSSatish Balay } 107827bd09bSSatish Balay 108827bd09bSSatish Balay 109827bd09bSSatish Balay 110827bd09bSSatish Balay /**********************************ivec.c************************************** 111827bd09bSSatish Balay Function ivec_zero() 112827bd09bSSatish Balay 113827bd09bSSatish Balay Input : 114827bd09bSSatish Balay Output: 115827bd09bSSatish Balay Return: 116827bd09bSSatish Balay Description: 117827bd09bSSatish Balay ***********************************ivec.c*************************************/ 118827bd09bSSatish Balay void 119*a501084fSBarry Smith ivec_zero( int *arg1, int n) 120827bd09bSSatish Balay { 121827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 122827bd09bSSatish Balay } 123827bd09bSSatish Balay 124827bd09bSSatish Balay 125827bd09bSSatish Balay 126827bd09bSSatish Balay /**********************************ivec.c************************************** 127827bd09bSSatish Balay Function ivec_comp() 128827bd09bSSatish Balay 129827bd09bSSatish Balay Input : 130827bd09bSSatish Balay Output: 131827bd09bSSatish Balay Return: 132827bd09bSSatish Balay Description: 133827bd09bSSatish Balay ***********************************ivec.c*************************************/ 134827bd09bSSatish Balay void 135*a501084fSBarry Smith ivec_comp( int *arg1, int n) 136827bd09bSSatish Balay { 137827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 138827bd09bSSatish Balay } 139827bd09bSSatish Balay 140827bd09bSSatish Balay 141827bd09bSSatish Balay 142827bd09bSSatish Balay /**********************************ivec.c************************************** 143827bd09bSSatish Balay Function ivec_neg_one() 144827bd09bSSatish Balay 145827bd09bSSatish Balay Input : 146827bd09bSSatish Balay Output: 147827bd09bSSatish Balay Return: 148827bd09bSSatish Balay Description: 149827bd09bSSatish Balay ***********************************ivec.c*************************************/ 150827bd09bSSatish Balay void 151*a501084fSBarry Smith ivec_neg_one( int *arg1, int n) 152827bd09bSSatish Balay { 153827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 154827bd09bSSatish Balay } 155827bd09bSSatish Balay 156827bd09bSSatish Balay 157827bd09bSSatish Balay 158827bd09bSSatish Balay /**********************************ivec.c************************************** 159827bd09bSSatish Balay Function ivec_pos_one() 160827bd09bSSatish Balay 161827bd09bSSatish Balay Input : 162827bd09bSSatish Balay Output: 163827bd09bSSatish Balay Return: 164827bd09bSSatish Balay Description: 165827bd09bSSatish Balay ***********************************ivec.c*************************************/ 166827bd09bSSatish Balay void 167*a501084fSBarry Smith ivec_pos_one( int *arg1, int n) 168827bd09bSSatish Balay { 169827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 170827bd09bSSatish Balay } 171827bd09bSSatish Balay 172827bd09bSSatish Balay 173827bd09bSSatish Balay 174827bd09bSSatish Balay /**********************************ivec.c************************************** 175827bd09bSSatish Balay Function ivec_c_index() 176827bd09bSSatish Balay 177827bd09bSSatish Balay Input : 178827bd09bSSatish Balay Output: 179827bd09bSSatish Balay Return: 180827bd09bSSatish Balay Description: 181827bd09bSSatish Balay ***********************************ivec.c*************************************/ 182827bd09bSSatish Balay void 183*a501084fSBarry Smith ivec_c_index( int *arg1, int n) 184827bd09bSSatish Balay { 185*a501084fSBarry Smith int i=0; 186827bd09bSSatish Balay 187827bd09bSSatish Balay 188827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 189827bd09bSSatish Balay } 190827bd09bSSatish Balay 191827bd09bSSatish Balay 192827bd09bSSatish Balay 193827bd09bSSatish Balay /**********************************ivec.c************************************** 194827bd09bSSatish Balay Function ivec_fortran_index() 195827bd09bSSatish Balay 196827bd09bSSatish Balay Input : 197827bd09bSSatish Balay Output: 198827bd09bSSatish Balay Return: 199827bd09bSSatish Balay Description: 200827bd09bSSatish Balay ***********************************ivec.c*************************************/ 201827bd09bSSatish Balay void 202*a501084fSBarry Smith ivec_fortran_index( int *arg1, int n) 203827bd09bSSatish Balay { 204*a501084fSBarry Smith int i=0; 205827bd09bSSatish Balay 206827bd09bSSatish Balay 207827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 208827bd09bSSatish Balay } 209827bd09bSSatish Balay 210827bd09bSSatish Balay 211827bd09bSSatish Balay 212827bd09bSSatish Balay /**********************************ivec.c************************************** 213827bd09bSSatish Balay Function ivec_set() 214827bd09bSSatish Balay 215827bd09bSSatish Balay Input : 216827bd09bSSatish Balay Output: 217827bd09bSSatish Balay Return: 218827bd09bSSatish Balay Description: 219827bd09bSSatish Balay ***********************************ivec.c*************************************/ 220827bd09bSSatish Balay void 221*a501084fSBarry Smith ivec_set( int *arg1, int arg2, int n) 222827bd09bSSatish Balay { 223827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 224827bd09bSSatish Balay } 225827bd09bSSatish Balay 226827bd09bSSatish Balay 227827bd09bSSatish Balay 228827bd09bSSatish Balay /**********************************ivec.c************************************** 229827bd09bSSatish Balay Function ivec_cmp() 230827bd09bSSatish Balay 231827bd09bSSatish Balay Input : 232827bd09bSSatish Balay Output: 233827bd09bSSatish Balay Return: 234827bd09bSSatish Balay Description: 235827bd09bSSatish Balay ***********************************ivec.c*************************************/ 236827bd09bSSatish Balay int 237*a501084fSBarry Smith ivec_cmp( int *arg1, int *arg2, int n) 238827bd09bSSatish Balay { 239827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 240827bd09bSSatish Balay return(TRUE); 241827bd09bSSatish Balay } 242827bd09bSSatish Balay 243827bd09bSSatish Balay 244827bd09bSSatish Balay 245827bd09bSSatish Balay /**********************************ivec.c************************************** 246827bd09bSSatish Balay Function ivec_max() 247827bd09bSSatish Balay 248827bd09bSSatish Balay Input : 249827bd09bSSatish Balay Output: 250827bd09bSSatish Balay Return: 251827bd09bSSatish Balay Description: 252827bd09bSSatish Balay ***********************************ivec.c*************************************/ 253827bd09bSSatish Balay void 254*a501084fSBarry Smith ivec_max( int *arg1, int *arg2, int n) 255827bd09bSSatish Balay { 25639945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 257827bd09bSSatish Balay } 258827bd09bSSatish Balay 259827bd09bSSatish Balay 260827bd09bSSatish Balay 261827bd09bSSatish Balay /**********************************ivec.c************************************** 262827bd09bSSatish Balay Function ivec_min() 263827bd09bSSatish Balay 264827bd09bSSatish Balay Input : 265827bd09bSSatish Balay Output: 266827bd09bSSatish Balay Return: 267827bd09bSSatish Balay Description: 268827bd09bSSatish Balay ***********************************ivec.c*************************************/ 269827bd09bSSatish Balay void 270*a501084fSBarry Smith ivec_min( int *arg1, int *arg2, int n) 271827bd09bSSatish Balay { 27239945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 273827bd09bSSatish Balay } 274827bd09bSSatish Balay 275827bd09bSSatish Balay 276827bd09bSSatish Balay 277827bd09bSSatish Balay /**********************************ivec.c************************************** 278827bd09bSSatish Balay Function ivec_mult() 279827bd09bSSatish Balay 280827bd09bSSatish Balay Input : 281827bd09bSSatish Balay Output: 282827bd09bSSatish Balay Return: 283827bd09bSSatish Balay Description: 284827bd09bSSatish Balay ***********************************ivec.c*************************************/ 285827bd09bSSatish Balay void 286*a501084fSBarry Smith ivec_mult( int *arg1, int *arg2, int n) 287827bd09bSSatish Balay { 288827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 289827bd09bSSatish Balay } 290827bd09bSSatish Balay 291827bd09bSSatish Balay 292827bd09bSSatish Balay 293827bd09bSSatish Balay /**********************************ivec.c************************************** 294827bd09bSSatish Balay Function ivec_add() 295827bd09bSSatish Balay 296827bd09bSSatish Balay Input : 297827bd09bSSatish Balay Output: 298827bd09bSSatish Balay Return: 299827bd09bSSatish Balay Description: 300827bd09bSSatish Balay ***********************************ivec.c*************************************/ 301827bd09bSSatish Balay void 302*a501084fSBarry Smith ivec_add( int *arg1, int *arg2, int n) 303827bd09bSSatish Balay { 304827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 305827bd09bSSatish Balay } 306827bd09bSSatish Balay 307827bd09bSSatish Balay 308827bd09bSSatish Balay 309827bd09bSSatish Balay /**********************************ivec.c************************************** 310827bd09bSSatish Balay Function ivec_lxor() 311827bd09bSSatish Balay 312827bd09bSSatish Balay Input : 313827bd09bSSatish Balay Output: 314827bd09bSSatish Balay Return: 315827bd09bSSatish Balay Description: 316827bd09bSSatish Balay ***********************************ivec.c*************************************/ 317827bd09bSSatish Balay void 318*a501084fSBarry Smith ivec_lxor( int *arg1, int *arg2, int n) 319827bd09bSSatish Balay { 320827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 321827bd09bSSatish Balay } 322827bd09bSSatish Balay 323827bd09bSSatish Balay 324827bd09bSSatish Balay 325827bd09bSSatish Balay /**********************************ivec.c************************************** 326827bd09bSSatish Balay Function ivec_xor() 327827bd09bSSatish Balay 328827bd09bSSatish Balay Input : 329827bd09bSSatish Balay Output: 330827bd09bSSatish Balay Return: 331827bd09bSSatish Balay Description: 332827bd09bSSatish Balay ***********************************ivec.c*************************************/ 333827bd09bSSatish Balay void 334*a501084fSBarry Smith ivec_xor( int *arg1, int *arg2, int n) 335827bd09bSSatish Balay { 336827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 337827bd09bSSatish Balay } 338827bd09bSSatish Balay 339827bd09bSSatish Balay 340827bd09bSSatish Balay 341827bd09bSSatish Balay /**********************************ivec.c************************************** 342827bd09bSSatish Balay Function ivec_or() 343827bd09bSSatish Balay 344827bd09bSSatish Balay Input : 345827bd09bSSatish Balay Output: 346827bd09bSSatish Balay Return: 347827bd09bSSatish Balay Description: 348827bd09bSSatish Balay ***********************************ivec.c*************************************/ 349827bd09bSSatish Balay void 350*a501084fSBarry Smith ivec_or( int *arg1, int *arg2, int n) 351827bd09bSSatish Balay { 352827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 353827bd09bSSatish Balay } 354827bd09bSSatish Balay 355827bd09bSSatish Balay 356827bd09bSSatish Balay 357827bd09bSSatish Balay /**********************************ivec.c************************************** 358827bd09bSSatish Balay Function ivec_lor() 359827bd09bSSatish Balay 360827bd09bSSatish Balay Input : 361827bd09bSSatish Balay Output: 362827bd09bSSatish Balay Return: 363827bd09bSSatish Balay Description: 364827bd09bSSatish Balay ***********************************ivec.c*************************************/ 365827bd09bSSatish Balay void 366*a501084fSBarry Smith ivec_lor( int *arg1, int *arg2, int n) 367827bd09bSSatish Balay { 368827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 369827bd09bSSatish Balay } 370827bd09bSSatish Balay 371827bd09bSSatish Balay 372827bd09bSSatish Balay 373827bd09bSSatish Balay /**********************************ivec.c************************************** 374827bd09bSSatish Balay Function ivec_or3() 375827bd09bSSatish Balay 376827bd09bSSatish Balay Input : 377827bd09bSSatish Balay Output: 378827bd09bSSatish Balay Return: 379827bd09bSSatish Balay Description: 380827bd09bSSatish Balay ***********************************ivec.c*************************************/ 381827bd09bSSatish Balay void 382*a501084fSBarry Smith ivec_or3( int *arg1, int *arg2, int *arg3, 383*a501084fSBarry Smith int n) 384827bd09bSSatish Balay { 385827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 386827bd09bSSatish Balay } 387827bd09bSSatish Balay 388827bd09bSSatish Balay 389827bd09bSSatish Balay 390827bd09bSSatish Balay /**********************************ivec.c************************************** 391827bd09bSSatish Balay Function ivec_and() 392827bd09bSSatish Balay 393827bd09bSSatish Balay Input : 394827bd09bSSatish Balay Output: 395827bd09bSSatish Balay Return: 396827bd09bSSatish Balay Description: 397827bd09bSSatish Balay ***********************************ivec.c*************************************/ 398827bd09bSSatish Balay void 399*a501084fSBarry Smith ivec_and( int *arg1, int *arg2, int n) 400827bd09bSSatish Balay { 401827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 402827bd09bSSatish Balay } 403827bd09bSSatish Balay 404827bd09bSSatish Balay 405827bd09bSSatish Balay 406827bd09bSSatish Balay /**********************************ivec.c************************************** 407827bd09bSSatish Balay Function ivec_land() 408827bd09bSSatish Balay 409827bd09bSSatish Balay Input : 410827bd09bSSatish Balay Output: 411827bd09bSSatish Balay Return: 412827bd09bSSatish Balay Description: 413827bd09bSSatish Balay ***********************************ivec.c*************************************/ 414827bd09bSSatish Balay void 415*a501084fSBarry Smith ivec_land( int *arg1, int *arg2, int n) 416827bd09bSSatish Balay { 417827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 418827bd09bSSatish Balay } 419827bd09bSSatish Balay 420827bd09bSSatish Balay 421827bd09bSSatish Balay 422827bd09bSSatish Balay /**********************************ivec.c************************************** 423827bd09bSSatish Balay Function ivec_and3() 424827bd09bSSatish Balay 425827bd09bSSatish Balay Input : 426827bd09bSSatish Balay Output: 427827bd09bSSatish Balay Return: 428827bd09bSSatish Balay Description: 429827bd09bSSatish Balay ***********************************ivec.c*************************************/ 430827bd09bSSatish Balay void 431*a501084fSBarry Smith ivec_and3( int *arg1, int *arg2, int *arg3, 432*a501084fSBarry Smith int n) 433827bd09bSSatish Balay { 434827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 435827bd09bSSatish Balay } 436827bd09bSSatish Balay 437827bd09bSSatish Balay 438827bd09bSSatish Balay 439827bd09bSSatish Balay /**********************************ivec.c************************************** 440827bd09bSSatish Balay Function ivec_sum 441827bd09bSSatish Balay 442827bd09bSSatish Balay Input : 443827bd09bSSatish Balay Output: 444827bd09bSSatish Balay Return: 445827bd09bSSatish Balay Description: 446827bd09bSSatish Balay ***********************************ivec.c*************************************/ 447*a501084fSBarry Smith int ivec_sum( int *arg1, int n) 448827bd09bSSatish Balay { 449*a501084fSBarry Smith int tmp = 0; 450827bd09bSSatish Balay 451827bd09bSSatish Balay 452827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 453827bd09bSSatish Balay return(tmp); 454827bd09bSSatish Balay } 455827bd09bSSatish Balay 456827bd09bSSatish Balay 457827bd09bSSatish Balay 458827bd09bSSatish Balay /**********************************ivec.c************************************** 459827bd09bSSatish Balay Function ivec_reduce_and 460827bd09bSSatish Balay 461827bd09bSSatish Balay Input : 462827bd09bSSatish Balay Output: 463827bd09bSSatish Balay Return: 464827bd09bSSatish Balay Description: 465827bd09bSSatish Balay ***********************************ivec.c*************************************/ 466*a501084fSBarry Smith int ivec_reduce_and( int *arg1, int n) 467827bd09bSSatish Balay { 468*a501084fSBarry Smith int tmp = ALL_ONES; 469827bd09bSSatish Balay 470827bd09bSSatish Balay 471827bd09bSSatish Balay while (n--) {tmp &= *arg1++;} 472827bd09bSSatish Balay return(tmp); 473827bd09bSSatish Balay } 474827bd09bSSatish Balay 475827bd09bSSatish Balay 476827bd09bSSatish Balay 477827bd09bSSatish Balay /**********************************ivec.c************************************** 478827bd09bSSatish Balay Function ivec_reduce_or 479827bd09bSSatish Balay 480827bd09bSSatish Balay Input : 481827bd09bSSatish Balay Output: 482827bd09bSSatish Balay Return: 483827bd09bSSatish Balay Description: 484827bd09bSSatish Balay ***********************************ivec.c*************************************/ 485*a501084fSBarry Smith int ivec_reduce_or( int *arg1, int n) 486827bd09bSSatish Balay { 487*a501084fSBarry Smith int tmp = 0; 488827bd09bSSatish Balay 489827bd09bSSatish Balay 490827bd09bSSatish Balay while (n--) {tmp |= *arg1++;} 491827bd09bSSatish Balay return(tmp); 492827bd09bSSatish Balay } 493827bd09bSSatish Balay 494827bd09bSSatish Balay 495827bd09bSSatish Balay 496827bd09bSSatish Balay /**********************************ivec.c************************************** 497827bd09bSSatish Balay Function ivec_prod 498827bd09bSSatish Balay 499827bd09bSSatish Balay Input : 500827bd09bSSatish Balay Output: 501827bd09bSSatish Balay Return: 502827bd09bSSatish Balay Description: 503827bd09bSSatish Balay ***********************************ivec.c*************************************/ 504*a501084fSBarry Smith int ivec_prod( int *arg1, int n) 505827bd09bSSatish Balay { 506*a501084fSBarry Smith int tmp = 1; 507827bd09bSSatish Balay 508827bd09bSSatish Balay 509827bd09bSSatish Balay while (n--) {tmp *= *arg1++;} 510827bd09bSSatish Balay return(tmp); 511827bd09bSSatish Balay } 512827bd09bSSatish Balay 513827bd09bSSatish Balay 514827bd09bSSatish Balay 515827bd09bSSatish Balay /**********************************ivec.c************************************** 516827bd09bSSatish Balay Function ivec_u_sum 517827bd09bSSatish Balay 518827bd09bSSatish Balay Input : 519827bd09bSSatish Balay Output: 520827bd09bSSatish Balay Return: 521827bd09bSSatish Balay Description: 522827bd09bSSatish Balay ***********************************ivec.c*************************************/ 523*a501084fSBarry Smith int ivec_u_sum( unsigned *arg1, int n) 524827bd09bSSatish Balay { 525*a501084fSBarry Smith unsigned tmp = 0; 526827bd09bSSatish Balay 527827bd09bSSatish Balay 528827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 529827bd09bSSatish Balay return(tmp); 530827bd09bSSatish Balay } 531827bd09bSSatish Balay 532827bd09bSSatish Balay 533827bd09bSSatish Balay 534827bd09bSSatish Balay /**********************************ivec.c************************************** 535827bd09bSSatish Balay Function ivec_lb() 536827bd09bSSatish Balay 537827bd09bSSatish Balay Input : 538827bd09bSSatish Balay Output: 539827bd09bSSatish Balay Return: 540827bd09bSSatish Balay Description: 541827bd09bSSatish Balay ***********************************ivec.c*************************************/ 542827bd09bSSatish Balay int 543*a501084fSBarry Smith ivec_lb( int *arg1, int n) 544827bd09bSSatish Balay { 545*a501084fSBarry Smith int min = INT_MAX; 546827bd09bSSatish Balay 547827bd09bSSatish Balay 54839945688SSatish Balay while (n--) {min = PetscMin(min,*arg1); arg1++;} 549827bd09bSSatish Balay return(min); 550827bd09bSSatish Balay } 551827bd09bSSatish Balay 552827bd09bSSatish Balay 553827bd09bSSatish Balay 554827bd09bSSatish Balay /**********************************ivec.c************************************** 555827bd09bSSatish Balay Function ivec_ub() 556827bd09bSSatish Balay 557827bd09bSSatish Balay Input : 558827bd09bSSatish Balay Output: 559827bd09bSSatish Balay Return: 560827bd09bSSatish Balay Description: 561827bd09bSSatish Balay ***********************************ivec.c*************************************/ 562827bd09bSSatish Balay int 563*a501084fSBarry Smith ivec_ub( int *arg1, int n) 564827bd09bSSatish Balay { 565*a501084fSBarry Smith int max = INT_MIN; 566827bd09bSSatish Balay 567827bd09bSSatish Balay 56839945688SSatish Balay while (n--) {max = PetscMax(max,*arg1); arg1++;} 569827bd09bSSatish Balay return(max); 570827bd09bSSatish Balay } 571827bd09bSSatish Balay 572827bd09bSSatish Balay 573827bd09bSSatish Balay 574827bd09bSSatish Balay /**********************************ivec.c************************************** 575827bd09bSSatish Balay Function split_buf() 576827bd09bSSatish Balay 577827bd09bSSatish Balay Input : 578827bd09bSSatish Balay Output: 579827bd09bSSatish Balay Return: 580827bd09bSSatish Balay Description: 581827bd09bSSatish Balay 582827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 583827bd09bSSatish Balay ***********************************ivec.c*************************************/ 584827bd09bSSatish Balay int 585*a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2, int size) 586827bd09bSSatish Balay { 587827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 588827bd09bSSatish Balay return(size); 589827bd09bSSatish Balay } 590827bd09bSSatish Balay 591827bd09bSSatish Balay 592827bd09bSSatish Balay 593827bd09bSSatish Balay /**********************************ivec.c************************************** 594827bd09bSSatish Balay Function ivec_non_uniform() 595827bd09bSSatish Balay 596827bd09bSSatish Balay Input : 597827bd09bSSatish Balay Output: 598827bd09bSSatish Balay Return: 599827bd09bSSatish Balay Description: 600827bd09bSSatish Balay ***********************************ivec.c*************************************/ 601827bd09bSSatish Balay void 602*a501084fSBarry Smith ivec_non_uniform(int *arg1, int *arg2, int n, int *arg3) 603827bd09bSSatish Balay { 604*a501084fSBarry Smith int i, j, type; 605827bd09bSSatish Balay 606827bd09bSSatish Balay 607827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 608827bd09bSSatish Balay for (i=0;i<n;) 609827bd09bSSatish Balay { 610827bd09bSSatish Balay /* clump 'em for now */ 611827bd09bSSatish Balay j=i+1; 612827bd09bSSatish Balay type = arg3[i]; 613827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 614827bd09bSSatish Balay {j++;} 615827bd09bSSatish Balay 616827bd09bSSatish Balay /* how many together */ 617827bd09bSSatish Balay j -= i; 618827bd09bSSatish Balay 619827bd09bSSatish Balay /* call appropriate ivec function */ 620827bd09bSSatish Balay if (type == GL_MAX) 621827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 622827bd09bSSatish Balay else if (type == GL_MIN) 623827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 624827bd09bSSatish Balay else if (type == GL_MULT) 625827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 626827bd09bSSatish Balay else if (type == GL_ADD) 627827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 628827bd09bSSatish Balay else if (type == GL_B_XOR) 629827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 630827bd09bSSatish Balay else if (type == GL_B_OR) 631827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 632827bd09bSSatish Balay else if (type == GL_B_AND) 633827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 634827bd09bSSatish Balay else if (type == GL_L_XOR) 635827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 636827bd09bSSatish Balay else if (type == GL_L_OR) 637827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 638827bd09bSSatish Balay else if (type == GL_L_AND) 639827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 640827bd09bSSatish Balay else 641827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 642827bd09bSSatish Balay 643827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 644827bd09bSSatish Balay } 645827bd09bSSatish Balay } 646827bd09bSSatish Balay 647827bd09bSSatish Balay 648827bd09bSSatish Balay 649827bd09bSSatish Balay /**********************************ivec.c************************************** 650827bd09bSSatish Balay Function ivec_addr() 651827bd09bSSatish Balay 652827bd09bSSatish Balay Input : 653827bd09bSSatish Balay Output: 654827bd09bSSatish Balay Return: 655827bd09bSSatish Balay Description: 656827bd09bSSatish Balay ***********************************ivec.c*************************************/ 657*a501084fSBarry Smith vfp ivec_fct_addr( int type) 658827bd09bSSatish Balay { 659827bd09bSSatish Balay if (type == NON_UNIFORM) 660827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_non_uniform);} 661827bd09bSSatish Balay else if (type == GL_MAX) 662827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_max);} 663827bd09bSSatish Balay else if (type == GL_MIN) 664827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_min);} 665827bd09bSSatish Balay else if (type == GL_MULT) 666827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_mult);} 667827bd09bSSatish Balay else if (type == GL_ADD) 668827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_add);} 669827bd09bSSatish Balay else if (type == GL_B_XOR) 670827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_xor);} 671827bd09bSSatish Balay else if (type == GL_B_OR) 672827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_or);} 673827bd09bSSatish Balay else if (type == GL_B_AND) 674827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_and);} 675827bd09bSSatish Balay else if (type == GL_L_XOR) 676827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lxor);} 677827bd09bSSatish Balay else if (type == GL_L_OR) 678827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lor);} 679827bd09bSSatish Balay else if (type == GL_L_AND) 680827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_land);} 681827bd09bSSatish Balay 682827bd09bSSatish Balay /* catch all ... not good if we get here */ 683827bd09bSSatish Balay return(NULL); 684827bd09bSSatish Balay } 685827bd09bSSatish Balay 686827bd09bSSatish Balay 687827bd09bSSatish Balay /**********************************ivec.c************************************** 688827bd09bSSatish Balay Function ct_bits() 689827bd09bSSatish Balay 690827bd09bSSatish Balay Input : 691827bd09bSSatish Balay Output: 692827bd09bSSatish Balay Return: 693827bd09bSSatish Balay Description: MUST FIX THIS!!! 694827bd09bSSatish Balay ***********************************ivec.c*************************************/ 695827bd09bSSatish Balay #if defined(notusing) 696827bd09bSSatish Balay static 697827bd09bSSatish Balay int 698*a501084fSBarry Smith ivec_ct_bits( int *ptr, int n) 699827bd09bSSatish Balay { 700*a501084fSBarry Smith int tmp=0; 701827bd09bSSatish Balay 702827bd09bSSatish Balay 703827bd09bSSatish Balay /* should expand to full 32 bit */ 704827bd09bSSatish Balay while (n--) 705827bd09bSSatish Balay { 706827bd09bSSatish Balay if (*ptr&128) {tmp++;} 707827bd09bSSatish Balay if (*ptr&64) {tmp++;} 708827bd09bSSatish Balay if (*ptr&32) {tmp++;} 709827bd09bSSatish Balay if (*ptr&16) {tmp++;} 710827bd09bSSatish Balay if (*ptr&8) {tmp++;} 711827bd09bSSatish Balay if (*ptr&4) {tmp++;} 712827bd09bSSatish Balay if (*ptr&2) {tmp++;} 713827bd09bSSatish Balay if (*ptr&1) {tmp++;} 714827bd09bSSatish Balay ptr++; 715827bd09bSSatish Balay } 716827bd09bSSatish Balay 717827bd09bSSatish Balay return(tmp); 718827bd09bSSatish Balay } 719827bd09bSSatish Balay #endif 720827bd09bSSatish Balay 721827bd09bSSatish Balay 722827bd09bSSatish Balay /****************************************************************************** 723827bd09bSSatish Balay Function: ivec_sort(). 724827bd09bSSatish Balay 725827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 726827bd09bSSatish Balay Output: sorted list (in ascending order). 727827bd09bSSatish Balay Return: none. 728827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 729827bd09bSSatish Balay ******************************************************************************/ 730827bd09bSSatish Balay void 731*a501084fSBarry Smith ivec_sort( int *ar, int size) 732827bd09bSSatish Balay { 733*a501084fSBarry Smith int *pi, *pj, temp; 734*a501084fSBarry Smith int **top_a = (int **) offset_stack; 735*a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 736827bd09bSSatish Balay 737827bd09bSSatish Balay 738827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 739827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 740827bd09bSSatish Balay size--; 741827bd09bSSatish Balay 742827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 743827bd09bSSatish Balay for (;;) 744827bd09bSSatish Balay { 745827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 746827bd09bSSatish Balay if (size > SORT_OPT) 747827bd09bSSatish Balay { 748827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 749827bd09bSSatish Balay pi = ar+1; 750827bd09bSSatish Balay pj = ar+size; 751827bd09bSSatish Balay 752827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 753827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 754827bd09bSSatish Balay 755827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 756827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 757827bd09bSSatish Balay if (*pi > *pj) 758827bd09bSSatish Balay {SWAP(*pi,*pj)} 759827bd09bSSatish Balay if (*ar > *pj) 760827bd09bSSatish Balay {SWAP(*ar,*pj)} 761827bd09bSSatish Balay else if (*pi > *ar) 762827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 763827bd09bSSatish Balay 764827bd09bSSatish Balay /* partition about pivot_value ... */ 765827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 766827bd09bSSatish Balay for(;;) 767827bd09bSSatish Balay { 768827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 769827bd09bSSatish Balay do pi++; while (*pi<*ar); 770827bd09bSSatish Balay do pj--; while (*pj>*ar); 771827bd09bSSatish Balay 772827bd09bSSatish Balay /* if we've crossed we're done */ 773827bd09bSSatish Balay if (pj<pi) break; 774827bd09bSSatish Balay 775827bd09bSSatish Balay /* else swap */ 776827bd09bSSatish Balay SWAP(*pi,*pj) 777827bd09bSSatish Balay } 778827bd09bSSatish Balay 779827bd09bSSatish Balay /* place pivot_value in it's correct location */ 780827bd09bSSatish Balay SWAP(*ar,*pj) 781827bd09bSSatish Balay 782827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 783827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 784827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 785827bd09bSSatish Balay 786827bd09bSSatish Balay /* push right hand child iff length > 1 */ 787827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 788827bd09bSSatish Balay { 789827bd09bSSatish Balay *(top_a++) = pi; 790827bd09bSSatish Balay size -= *top_s+2; 791827bd09bSSatish Balay top_s++; 792827bd09bSSatish Balay } 793827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 794827bd09bSSatish Balay else if (size -= *top_s+2) 795827bd09bSSatish Balay {;} 796827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 797827bd09bSSatish Balay else 798827bd09bSSatish Balay { 799827bd09bSSatish Balay ar = *(--top_a); 800827bd09bSSatish Balay size = *(--top_s); 801827bd09bSSatish Balay } 802827bd09bSSatish Balay } 803827bd09bSSatish Balay 804827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 805827bd09bSSatish Balay else 806827bd09bSSatish Balay { 807827bd09bSSatish Balay /* insertion sort for bottom */ 808827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 809827bd09bSSatish Balay { 810827bd09bSSatish Balay temp = *pj; 811827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 812827bd09bSSatish Balay { 813827bd09bSSatish Balay if (*pi <= temp) break; 814827bd09bSSatish Balay *(pi+1)=*pi; 815827bd09bSSatish Balay } 816827bd09bSSatish Balay *(pi+1)=temp; 817827bd09bSSatish Balay } 818827bd09bSSatish Balay 819827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 820827bd09bSSatish Balay if (top_s==bottom_s) return; 821827bd09bSSatish Balay 822827bd09bSSatish Balay /* else pop another list from the stack */ 823827bd09bSSatish Balay ar = *(--top_a); 824827bd09bSSatish Balay size = *(--top_s); 825827bd09bSSatish Balay } 826827bd09bSSatish Balay } 827827bd09bSSatish Balay } 828827bd09bSSatish Balay 829827bd09bSSatish Balay 830827bd09bSSatish Balay 831827bd09bSSatish Balay /****************************************************************************** 832827bd09bSSatish Balay Function: ivec_sort_companion(). 833827bd09bSSatish Balay 834827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 835827bd09bSSatish Balay Output: sorted list (in ascending order). 836827bd09bSSatish Balay Return: none. 837827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 838827bd09bSSatish Balay ******************************************************************************/ 839827bd09bSSatish Balay void 840*a501084fSBarry Smith ivec_sort_companion( int *ar, int *ar2, int size) 841827bd09bSSatish Balay { 842*a501084fSBarry Smith int *pi, *pj, temp, temp2; 843*a501084fSBarry Smith int **top_a = (int **)offset_stack; 844*a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 845*a501084fSBarry Smith int *pi2, *pj2; 846*a501084fSBarry Smith int mid; 847827bd09bSSatish Balay 848827bd09bSSatish Balay 849827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 850827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 851827bd09bSSatish Balay size--; 852827bd09bSSatish Balay 853827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 854827bd09bSSatish Balay for (;;) 855827bd09bSSatish Balay { 856827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 857827bd09bSSatish Balay if (size > SORT_OPT) 858827bd09bSSatish Balay { 859827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 860827bd09bSSatish Balay mid = size>>1; 861827bd09bSSatish Balay pi = ar+1; 862827bd09bSSatish Balay pj = ar+mid; 863827bd09bSSatish Balay pi2 = ar2+1; 864827bd09bSSatish Balay pj2 = ar2+mid; 865827bd09bSSatish Balay 866827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 867827bd09bSSatish Balay SWAP(*pi,*pj) 868827bd09bSSatish Balay SWAP(*pi2,*pj2) 869827bd09bSSatish Balay 870827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 871827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 872827bd09bSSatish Balay pj = ar+size; 873827bd09bSSatish Balay pj2 = ar2+size; 874827bd09bSSatish Balay if (*pi > *pj) 875827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 876827bd09bSSatish Balay if (*ar > *pj) 877827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 878827bd09bSSatish Balay else if (*pi > *ar) 879827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 880827bd09bSSatish Balay 881827bd09bSSatish Balay /* partition about pivot_value ... */ 882827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 883827bd09bSSatish Balay for(;;) 884827bd09bSSatish Balay { 885827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 886827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 887827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 888827bd09bSSatish Balay 889827bd09bSSatish Balay /* if we've crossed we're done */ 890827bd09bSSatish Balay if (pj<pi) break; 891827bd09bSSatish Balay 892827bd09bSSatish Balay /* else swap */ 893827bd09bSSatish Balay SWAP(*pi,*pj) 894827bd09bSSatish Balay SWAP(*pi2,*pj2) 895827bd09bSSatish Balay } 896827bd09bSSatish Balay 897827bd09bSSatish Balay /* place pivot_value in it's correct location */ 898827bd09bSSatish Balay SWAP(*ar,*pj) 899827bd09bSSatish Balay SWAP(*ar2,*pj2) 900827bd09bSSatish Balay 901827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 902827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 903827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 904827bd09bSSatish Balay 905827bd09bSSatish Balay /* push right hand child iff length > 1 */ 906827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 907827bd09bSSatish Balay { 908827bd09bSSatish Balay *(top_a++) = pi; 909827bd09bSSatish Balay *(top_a++) = pi2; 910827bd09bSSatish Balay size -= *top_s+2; 911827bd09bSSatish Balay top_s++; 912827bd09bSSatish Balay } 913827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 914827bd09bSSatish Balay else if (size -= *top_s+2) 915827bd09bSSatish Balay {;} 916827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 917827bd09bSSatish Balay else 918827bd09bSSatish Balay { 919827bd09bSSatish Balay ar2 = *(--top_a); 920827bd09bSSatish Balay ar = *(--top_a); 921827bd09bSSatish Balay size = *(--top_s); 922827bd09bSSatish Balay } 923827bd09bSSatish Balay } 924827bd09bSSatish Balay 925827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 926827bd09bSSatish Balay else 927827bd09bSSatish Balay { 928827bd09bSSatish Balay /* insertion sort for bottom */ 929827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 930827bd09bSSatish Balay { 931827bd09bSSatish Balay temp = *pj; 932827bd09bSSatish Balay temp2 = *pj2; 933827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 934827bd09bSSatish Balay { 935827bd09bSSatish Balay if (*pi <= temp) break; 936827bd09bSSatish Balay *(pi+1)=*pi; 937827bd09bSSatish Balay *(pi2+1)=*pi2; 938827bd09bSSatish Balay } 939827bd09bSSatish Balay *(pi+1)=temp; 940827bd09bSSatish Balay *(pi2+1)=temp2; 941827bd09bSSatish Balay } 942827bd09bSSatish Balay 943827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 944827bd09bSSatish Balay if (top_s==bottom_s) return; 945827bd09bSSatish Balay 946827bd09bSSatish Balay /* else pop another list from the stack */ 947827bd09bSSatish Balay ar2 = *(--top_a); 948827bd09bSSatish Balay ar = *(--top_a); 949827bd09bSSatish Balay size = *(--top_s); 950827bd09bSSatish Balay } 951827bd09bSSatish Balay } 952827bd09bSSatish Balay } 953827bd09bSSatish Balay 954827bd09bSSatish Balay 955827bd09bSSatish Balay 956827bd09bSSatish Balay /****************************************************************************** 957827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 958827bd09bSSatish Balay 959827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 960827bd09bSSatish Balay Output: sorted list (in ascending order). 961827bd09bSSatish Balay Return: none. 962827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 963827bd09bSSatish Balay ******************************************************************************/ 964827bd09bSSatish Balay void 965*a501084fSBarry Smith ivec_sort_companion_hack( int *ar, int **ar2, 966*a501084fSBarry Smith int size) 967827bd09bSSatish Balay { 968*a501084fSBarry Smith int *pi, *pj, temp, *ptr; 969*a501084fSBarry Smith int **top_a = (int **)offset_stack; 970*a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 971*a501084fSBarry Smith int **pi2, **pj2; 972*a501084fSBarry Smith int mid; 973827bd09bSSatish Balay 974827bd09bSSatish Balay 975827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 976827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 977827bd09bSSatish Balay size--; 978827bd09bSSatish Balay 979827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 980827bd09bSSatish Balay for (;;) 981827bd09bSSatish Balay { 982827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 983827bd09bSSatish Balay if (size > SORT_OPT) 984827bd09bSSatish Balay { 985827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 986827bd09bSSatish Balay mid = size>>1; 987827bd09bSSatish Balay pi = ar+1; 988827bd09bSSatish Balay pj = ar+mid; 989827bd09bSSatish Balay pi2 = ar2+1; 990827bd09bSSatish Balay pj2 = ar2+mid; 991827bd09bSSatish Balay 992827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 993827bd09bSSatish Balay SWAP(*pi,*pj) 994827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 995827bd09bSSatish Balay 996827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 997827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 998827bd09bSSatish Balay pj = ar+size; 999827bd09bSSatish Balay pj2 = ar2+size; 1000827bd09bSSatish Balay if (*pi > *pj) 1001827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1002827bd09bSSatish Balay if (*ar > *pj) 1003827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1004827bd09bSSatish Balay else if (*pi > *ar) 1005827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1006827bd09bSSatish Balay 1007827bd09bSSatish Balay /* partition about pivot_value ... */ 1008827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1009827bd09bSSatish Balay for(;;) 1010827bd09bSSatish Balay { 1011827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1012827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1013827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1014827bd09bSSatish Balay 1015827bd09bSSatish Balay /* if we've crossed we're done */ 1016827bd09bSSatish Balay if (pj<pi) break; 1017827bd09bSSatish Balay 1018827bd09bSSatish Balay /* else swap */ 1019827bd09bSSatish Balay SWAP(*pi,*pj) 1020827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1021827bd09bSSatish Balay } 1022827bd09bSSatish Balay 1023827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1024827bd09bSSatish Balay SWAP(*ar,*pj) 1025827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1026827bd09bSSatish Balay 1027827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1028827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1029827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1030827bd09bSSatish Balay 1031827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1032827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1033827bd09bSSatish Balay { 1034827bd09bSSatish Balay *(top_a++) = pi; 1035827bd09bSSatish Balay *(top_a++) = (int*) pi2; 1036827bd09bSSatish Balay size -= *top_s+2; 1037827bd09bSSatish Balay top_s++; 1038827bd09bSSatish Balay } 1039827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1040827bd09bSSatish Balay else if (size -= *top_s+2) 1041827bd09bSSatish Balay {;} 1042827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1043827bd09bSSatish Balay else 1044827bd09bSSatish Balay { 1045827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1046827bd09bSSatish Balay ar = *(--top_a); 1047827bd09bSSatish Balay size = *(--top_s); 1048827bd09bSSatish Balay } 1049827bd09bSSatish Balay } 1050827bd09bSSatish Balay 1051827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1052827bd09bSSatish Balay else 1053827bd09bSSatish Balay { 1054827bd09bSSatish Balay /* insertion sort for bottom */ 1055827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1056827bd09bSSatish Balay { 1057827bd09bSSatish Balay temp = *pj; 1058827bd09bSSatish Balay ptr = *pj2; 1059827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1060827bd09bSSatish Balay { 1061827bd09bSSatish Balay if (*pi <= temp) break; 1062827bd09bSSatish Balay *(pi+1)=*pi; 1063827bd09bSSatish Balay *(pi2+1)=*pi2; 1064827bd09bSSatish Balay } 1065827bd09bSSatish Balay *(pi+1)=temp; 1066827bd09bSSatish Balay *(pi2+1)=ptr; 1067827bd09bSSatish Balay } 1068827bd09bSSatish Balay 1069827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1070827bd09bSSatish Balay if (top_s==bottom_s) return; 1071827bd09bSSatish Balay 1072827bd09bSSatish Balay /* else pop another list from the stack */ 1073827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1074827bd09bSSatish Balay ar = *(--top_a); 1075827bd09bSSatish Balay size = *(--top_s); 1076827bd09bSSatish Balay } 1077827bd09bSSatish Balay } 1078827bd09bSSatish Balay } 1079827bd09bSSatish Balay 1080827bd09bSSatish Balay 1081827bd09bSSatish Balay 1082827bd09bSSatish Balay /****************************************************************************** 1083827bd09bSSatish Balay Function: SMI_sort(). 1084827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1085827bd09bSSatish Balay Output: sorted list (in ascending order). 1086827bd09bSSatish Balay Return: none. 1087827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1088827bd09bSSatish Balay ******************************************************************************/ 1089827bd09bSSatish Balay void 1090827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type) 1091827bd09bSSatish Balay { 1092827bd09bSSatish Balay if (type == SORT_INTEGER) 1093827bd09bSSatish Balay { 1094827bd09bSSatish Balay if (ar2) 1095827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 1096827bd09bSSatish Balay else 1097827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1098827bd09bSSatish Balay } 1099827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1100827bd09bSSatish Balay { 1101827bd09bSSatish Balay if (ar2) 1102827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 1103827bd09bSSatish Balay else 1104827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1105827bd09bSSatish Balay } 1106827bd09bSSatish Balay 1107827bd09bSSatish Balay else 1108827bd09bSSatish Balay { 1109827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1110827bd09bSSatish Balay } 1111827bd09bSSatish Balay /* 1112827bd09bSSatish Balay if (type == SORT_REAL) 1113827bd09bSSatish Balay { 1114827bd09bSSatish Balay if (ar2) 1115827bd09bSSatish Balay {rvec_sort_companion(ar2,ar1,size);} 1116827bd09bSSatish Balay else 1117827bd09bSSatish Balay {rvec_sort(ar1,size);} 1118827bd09bSSatish Balay } 1119827bd09bSSatish Balay */ 1120827bd09bSSatish Balay } 1121827bd09bSSatish Balay 1122827bd09bSSatish Balay 1123827bd09bSSatish Balay 1124827bd09bSSatish Balay /**********************************ivec.c************************************** 1125827bd09bSSatish Balay Function ivec_linear_search() 1126827bd09bSSatish Balay 1127827bd09bSSatish Balay Input : 1128827bd09bSSatish Balay Output: 1129827bd09bSSatish Balay Return: 1130827bd09bSSatish Balay Description: 1131827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1132827bd09bSSatish Balay int 1133*a501084fSBarry Smith ivec_linear_search( int item, int *list, int n) 1134827bd09bSSatish Balay { 1135*a501084fSBarry Smith int tmp = n-1; 1136827bd09bSSatish Balay 1137827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1138827bd09bSSatish Balay return(-1); 1139827bd09bSSatish Balay } 1140827bd09bSSatish Balay 1141827bd09bSSatish Balay 1142827bd09bSSatish Balay 1143827bd09bSSatish Balay /**********************************ivec.c************************************** 1144827bd09bSSatish Balay Function ivec_binary_search() 1145827bd09bSSatish Balay 1146827bd09bSSatish Balay Input : 1147827bd09bSSatish Balay Output: 1148827bd09bSSatish Balay Return: 1149827bd09bSSatish Balay Description: 1150827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1151827bd09bSSatish Balay int 1152*a501084fSBarry Smith ivec_binary_search( int item, int *list, int rh) 1153827bd09bSSatish Balay { 1154*a501084fSBarry Smith int mid, lh=0; 1155827bd09bSSatish Balay 1156827bd09bSSatish Balay rh--; 1157827bd09bSSatish Balay while (lh<=rh) 1158827bd09bSSatish Balay { 1159827bd09bSSatish Balay mid = (lh+rh)>>1; 1160827bd09bSSatish Balay if (*(list+mid) == item) 1161827bd09bSSatish Balay {return(mid);} 1162827bd09bSSatish Balay if (*(list+mid) > item) 1163827bd09bSSatish Balay {rh = mid-1;} 1164827bd09bSSatish Balay else 1165827bd09bSSatish Balay {lh = mid+1;} 1166827bd09bSSatish Balay } 1167827bd09bSSatish Balay return(-1); 1168827bd09bSSatish Balay } 1169827bd09bSSatish Balay 1170827bd09bSSatish Balay 1171827bd09bSSatish Balay 1172827bd09bSSatish Balay /**********************************ivec.c************************************** 1173827bd09bSSatish Balay Function rvec_dump 1174827bd09bSSatish Balay 1175827bd09bSSatish Balay Input : 1176827bd09bSSatish Balay Output: 1177827bd09bSSatish Balay Return: 1178827bd09bSSatish Balay Description: 1179827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1180827bd09bSSatish Balay void 1181*a501084fSBarry Smith rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s) 1182827bd09bSSatish Balay { 1183827bd09bSSatish Balay int i; 1184827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1185827bd09bSSatish Balay for (i=0;i<n;i++) 1186827bd09bSSatish Balay {printf("%f ",v[i]);} 1187827bd09bSSatish Balay printf("\n"); 1188827bd09bSSatish Balay fflush(stdout); 1189827bd09bSSatish Balay } 1190827bd09bSSatish Balay 1191827bd09bSSatish Balay 1192827bd09bSSatish Balay 1193827bd09bSSatish Balay /**********************************ivec.c************************************** 1194827bd09bSSatish Balay Function rvec_lb_ub() 1195827bd09bSSatish Balay 1196827bd09bSSatish Balay Input : 1197827bd09bSSatish Balay Output: 1198827bd09bSSatish Balay Return: 1199827bd09bSSatish Balay Description: 1200827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1201827bd09bSSatish Balay void 1202*a501084fSBarry Smith rvec_lb_ub( PetscScalar *arg1, int n, PetscScalar *lb, PetscScalar *ub) 1203827bd09bSSatish Balay { 1204*a501084fSBarry Smith PetscScalar min = REAL_MAX; 1205*a501084fSBarry Smith PetscScalar max = -REAL_MAX; 1206827bd09bSSatish Balay 1207827bd09bSSatish Balay while (n--) 1208827bd09bSSatish Balay { 120939945688SSatish Balay min = PetscMin(min,*arg1); 121039945688SSatish Balay max = PetscMax(max,*arg1); 1211827bd09bSSatish Balay arg1++; 1212827bd09bSSatish Balay } 1213827bd09bSSatish Balay 1214827bd09bSSatish Balay *lb=min; 1215827bd09bSSatish Balay *ub=max; 1216827bd09bSSatish Balay } 1217827bd09bSSatish Balay 1218827bd09bSSatish Balay 1219827bd09bSSatish Balay 1220827bd09bSSatish Balay /********************************ivec.c************************************** 1221827bd09bSSatish Balay Function rvec_copy() 1222827bd09bSSatish Balay 1223827bd09bSSatish Balay Input : 1224827bd09bSSatish Balay Output: 1225827bd09bSSatish Balay Return: 1226827bd09bSSatish Balay Description: 1227827bd09bSSatish Balay *********************************ivec.c*************************************/ 1228827bd09bSSatish Balay void 1229*a501084fSBarry Smith rvec_copy( PetscScalar *arg1, PetscScalar *arg2, int n) 1230827bd09bSSatish Balay { 1231827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 1232827bd09bSSatish Balay } 1233827bd09bSSatish Balay 1234827bd09bSSatish Balay 1235827bd09bSSatish Balay 1236827bd09bSSatish Balay /********************************ivec.c************************************** 1237827bd09bSSatish Balay Function rvec_zero() 1238827bd09bSSatish Balay 1239827bd09bSSatish Balay Input : 1240827bd09bSSatish Balay Output: 1241827bd09bSSatish Balay Return: 1242827bd09bSSatish Balay Description: 1243827bd09bSSatish Balay *********************************ivec.c*************************************/ 1244827bd09bSSatish Balay void 1245*a501084fSBarry Smith rvec_zero( PetscScalar *arg1, int n) 1246827bd09bSSatish Balay { 1247827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 1248827bd09bSSatish Balay } 1249827bd09bSSatish Balay 1250827bd09bSSatish Balay 1251827bd09bSSatish Balay 1252827bd09bSSatish Balay /**********************************ivec.c************************************** 1253827bd09bSSatish Balay Function rvec_one() 1254827bd09bSSatish Balay 1255827bd09bSSatish Balay Input : 1256827bd09bSSatish Balay Output: 1257827bd09bSSatish Balay Return: 1258827bd09bSSatish Balay Description: 1259827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1260827bd09bSSatish Balay void 1261*a501084fSBarry Smith rvec_one( PetscScalar *arg1, int n) 1262827bd09bSSatish Balay { 1263827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 1264827bd09bSSatish Balay } 1265827bd09bSSatish Balay 1266827bd09bSSatish Balay 1267827bd09bSSatish Balay 1268827bd09bSSatish Balay /**********************************ivec.c************************************** 1269827bd09bSSatish Balay Function rvec_neg_one() 1270827bd09bSSatish Balay 1271827bd09bSSatish Balay Input : 1272827bd09bSSatish Balay Output: 1273827bd09bSSatish Balay Return: 1274827bd09bSSatish Balay Description: 1275827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1276827bd09bSSatish Balay void 1277*a501084fSBarry Smith rvec_neg_one( PetscScalar *arg1, int n) 1278827bd09bSSatish Balay { 1279827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 1280827bd09bSSatish Balay } 1281827bd09bSSatish Balay 1282827bd09bSSatish Balay 1283827bd09bSSatish Balay 1284827bd09bSSatish Balay /**********************************ivec.c************************************** 1285827bd09bSSatish Balay Function rvec_set() 1286827bd09bSSatish Balay 1287827bd09bSSatish Balay Input : 1288827bd09bSSatish Balay Output: 1289827bd09bSSatish Balay Return: 1290827bd09bSSatish Balay Description: 1291827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1292827bd09bSSatish Balay void 1293*a501084fSBarry Smith rvec_set( PetscScalar *arg1, PetscScalar arg2, int n) 1294827bd09bSSatish Balay { 1295827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 1296827bd09bSSatish Balay } 1297827bd09bSSatish Balay 1298827bd09bSSatish Balay 1299827bd09bSSatish Balay 1300827bd09bSSatish Balay /**********************************ivec.c************************************** 1301827bd09bSSatish Balay Function rvec_scale() 1302827bd09bSSatish Balay 1303827bd09bSSatish Balay Input : 1304827bd09bSSatish Balay Output: 1305827bd09bSSatish Balay Return: 1306827bd09bSSatish Balay Description: 1307827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1308827bd09bSSatish Balay void 1309*a501084fSBarry Smith rvec_scale( PetscScalar *arg1, PetscScalar arg2, int n) 1310827bd09bSSatish Balay { 1311827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 1312827bd09bSSatish Balay } 1313827bd09bSSatish Balay 1314827bd09bSSatish Balay 1315827bd09bSSatish Balay 1316827bd09bSSatish Balay /********************************ivec.c************************************** 1317827bd09bSSatish Balay Function rvec_add() 1318827bd09bSSatish Balay 1319827bd09bSSatish Balay Input : 1320827bd09bSSatish Balay Output: 1321827bd09bSSatish Balay Return: 1322827bd09bSSatish Balay Description: 1323827bd09bSSatish Balay *********************************ivec.c*************************************/ 1324827bd09bSSatish Balay void 1325*a501084fSBarry Smith rvec_add( PetscScalar *arg1, PetscScalar *arg2, int n) 1326827bd09bSSatish Balay { 1327827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1328827bd09bSSatish Balay } 1329827bd09bSSatish Balay 1330827bd09bSSatish Balay 1331827bd09bSSatish Balay 1332827bd09bSSatish Balay /********************************ivec.c************************************** 1333827bd09bSSatish Balay Function rvec_dot() 1334827bd09bSSatish Balay 1335827bd09bSSatish Balay Input : 1336827bd09bSSatish Balay Output: 1337827bd09bSSatish Balay Return: 1338827bd09bSSatish Balay Description: 1339827bd09bSSatish Balay *********************************ivec.c*************************************/ 1340*a501084fSBarry Smith PetscScalar 1341*a501084fSBarry Smith rvec_dot( PetscScalar *arg1, PetscScalar *arg2, int n) 1342827bd09bSSatish Balay { 1343*a501084fSBarry Smith PetscScalar dot=0.0; 1344827bd09bSSatish Balay 1345827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1346827bd09bSSatish Balay 1347827bd09bSSatish Balay return(dot); 1348827bd09bSSatish Balay } 1349827bd09bSSatish Balay 1350827bd09bSSatish Balay 1351827bd09bSSatish Balay 1352827bd09bSSatish Balay /********************************ivec.c************************************** 1353827bd09bSSatish Balay Function rvec_axpy() 1354827bd09bSSatish Balay 1355827bd09bSSatish Balay Input : 1356827bd09bSSatish Balay Output: 1357827bd09bSSatish Balay Return: 1358827bd09bSSatish Balay Description: 1359827bd09bSSatish Balay *********************************ivec.c*************************************/ 1360827bd09bSSatish Balay void 1361*a501084fSBarry Smith rvec_axpy( PetscScalar *arg1, PetscScalar *arg2, PetscScalar scale, 1362*a501084fSBarry Smith int n) 1363827bd09bSSatish Balay { 1364827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 1365827bd09bSSatish Balay } 1366827bd09bSSatish Balay 1367827bd09bSSatish Balay 1368827bd09bSSatish Balay /********************************ivec.c************************************** 1369827bd09bSSatish Balay Function rvec_mult() 1370827bd09bSSatish Balay 1371827bd09bSSatish Balay Input : 1372827bd09bSSatish Balay Output: 1373827bd09bSSatish Balay Return: 1374827bd09bSSatish Balay Description: 1375827bd09bSSatish Balay *********************************ivec.c*************************************/ 1376827bd09bSSatish Balay void 1377*a501084fSBarry Smith rvec_mult( PetscScalar *arg1, PetscScalar *arg2, int n) 1378827bd09bSSatish Balay { 1379827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1380827bd09bSSatish Balay } 1381827bd09bSSatish Balay 1382827bd09bSSatish Balay 1383827bd09bSSatish Balay 1384827bd09bSSatish Balay /********************************ivec.c************************************** 1385827bd09bSSatish Balay Function rvec_max() 1386827bd09bSSatish Balay 1387827bd09bSSatish Balay Input : 1388827bd09bSSatish Balay Output: 1389827bd09bSSatish Balay Return: 1390827bd09bSSatish Balay Description: 1391827bd09bSSatish Balay *********************************ivec.c*************************************/ 1392827bd09bSSatish Balay void 1393*a501084fSBarry Smith rvec_max( PetscScalar *arg1, PetscScalar *arg2, int n) 1394827bd09bSSatish Balay { 139539945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 1396827bd09bSSatish Balay } 1397827bd09bSSatish Balay 1398827bd09bSSatish Balay 1399827bd09bSSatish Balay 1400827bd09bSSatish Balay /********************************ivec.c************************************** 1401827bd09bSSatish Balay Function rvec_max_abs() 1402827bd09bSSatish Balay 1403827bd09bSSatish Balay Input : 1404827bd09bSSatish Balay Output: 1405827bd09bSSatish Balay Return: 1406827bd09bSSatish Balay Description: 1407827bd09bSSatish Balay *********************************ivec.c*************************************/ 1408827bd09bSSatish Balay void 1409*a501084fSBarry Smith rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1410827bd09bSSatish Balay { 1411827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 1412827bd09bSSatish Balay } 1413827bd09bSSatish Balay 1414827bd09bSSatish Balay 1415827bd09bSSatish Balay 1416827bd09bSSatish Balay /********************************ivec.c************************************** 1417827bd09bSSatish Balay Function rvec_min() 1418827bd09bSSatish Balay 1419827bd09bSSatish Balay Input : 1420827bd09bSSatish Balay Output: 1421827bd09bSSatish Balay Return: 1422827bd09bSSatish Balay Description: 1423827bd09bSSatish Balay *********************************ivec.c*************************************/ 1424827bd09bSSatish Balay void 1425*a501084fSBarry Smith rvec_min( PetscScalar *arg1, PetscScalar *arg2, int n) 1426827bd09bSSatish Balay { 142739945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 1428827bd09bSSatish Balay } 1429827bd09bSSatish Balay 1430827bd09bSSatish Balay 1431827bd09bSSatish Balay 1432827bd09bSSatish Balay /********************************ivec.c************************************** 1433827bd09bSSatish Balay Function rvec_min_abs() 1434827bd09bSSatish Balay 1435827bd09bSSatish Balay Input : 1436827bd09bSSatish Balay Output: 1437827bd09bSSatish Balay Return: 1438827bd09bSSatish Balay Description: 1439827bd09bSSatish Balay *********************************ivec.c*************************************/ 1440827bd09bSSatish Balay void 1441*a501084fSBarry Smith rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1442827bd09bSSatish Balay { 1443827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 1444827bd09bSSatish Balay } 1445827bd09bSSatish Balay 1446827bd09bSSatish Balay 1447827bd09bSSatish Balay 1448827bd09bSSatish Balay /********************************ivec.c************************************** 1449827bd09bSSatish Balay Function rvec_exists() 1450827bd09bSSatish Balay 1451827bd09bSSatish Balay Input : 1452827bd09bSSatish Balay Output: 1453827bd09bSSatish Balay Return: 1454827bd09bSSatish Balay Description: 1455827bd09bSSatish Balay *********************************ivec.c*************************************/ 1456827bd09bSSatish Balay void 1457*a501084fSBarry Smith rvec_exists( PetscScalar *arg1, PetscScalar *arg2, int n) 1458827bd09bSSatish Balay { 1459827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 1460827bd09bSSatish Balay } 1461827bd09bSSatish Balay 1462827bd09bSSatish Balay 1463827bd09bSSatish Balay 1464827bd09bSSatish Balay /**********************************ivec.c************************************** 1465827bd09bSSatish Balay Function rvec_non_uniform() 1466827bd09bSSatish Balay 1467827bd09bSSatish Balay Input : 1468827bd09bSSatish Balay Output: 1469827bd09bSSatish Balay Return: 1470827bd09bSSatish Balay Description: 1471827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1472827bd09bSSatish Balay void 1473*a501084fSBarry Smith rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, int n, int *arg3) 1474827bd09bSSatish Balay { 1475*a501084fSBarry Smith int i, j, type; 1476827bd09bSSatish Balay 1477827bd09bSSatish Balay 1478827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1479827bd09bSSatish Balay for (i=0;i<n;) 1480827bd09bSSatish Balay { 1481827bd09bSSatish Balay /* clump 'em for now */ 1482827bd09bSSatish Balay j=i+1; 1483827bd09bSSatish Balay type = arg3[i]; 1484827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1485827bd09bSSatish Balay {j++;} 1486827bd09bSSatish Balay 1487827bd09bSSatish Balay /* how many together */ 1488827bd09bSSatish Balay j -= i; 1489827bd09bSSatish Balay 1490827bd09bSSatish Balay /* call appropriate ivec function */ 1491827bd09bSSatish Balay if (type == GL_MAX) 1492827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1493827bd09bSSatish Balay else if (type == GL_MIN) 1494827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1495827bd09bSSatish Balay else if (type == GL_MULT) 1496827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1497827bd09bSSatish Balay else if (type == GL_ADD) 1498827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1499827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1500827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1501827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1502827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1503827bd09bSSatish Balay else if (type == GL_EXISTS) 1504827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1505827bd09bSSatish Balay else 1506827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1507827bd09bSSatish Balay 1508827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1509827bd09bSSatish Balay } 1510827bd09bSSatish Balay } 1511827bd09bSSatish Balay 1512827bd09bSSatish Balay 1513827bd09bSSatish Balay 1514827bd09bSSatish Balay /**********************************ivec.c************************************** 1515827bd09bSSatish Balay Function rvec_fct_addr() 1516827bd09bSSatish Balay 1517827bd09bSSatish Balay Input : 1518827bd09bSSatish Balay Output: 1519827bd09bSSatish Balay Return: 1520827bd09bSSatish Balay Description: 1521827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1522*a501084fSBarry Smith vfp rvec_fct_addr( int type) 1523827bd09bSSatish Balay { 1524827bd09bSSatish Balay if (type == NON_UNIFORM) 1525827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_non_uniform);} 1526827bd09bSSatish Balay else if (type == GL_MAX) 1527827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max);} 1528827bd09bSSatish Balay else if (type == GL_MIN) 1529827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min);} 1530827bd09bSSatish Balay else if (type == GL_MULT) 1531827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_mult);} 1532827bd09bSSatish Balay else if (type == GL_ADD) 1533827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_add);} 1534827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1535827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max_abs);} 1536827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1537827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min_abs);} 1538827bd09bSSatish Balay else if (type == GL_EXISTS) 1539827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_exists);} 1540827bd09bSSatish Balay 1541827bd09bSSatish Balay /* catch all ... not good if we get here */ 1542827bd09bSSatish Balay return(NULL); 1543827bd09bSSatish Balay } 1544827bd09bSSatish Balay 1545827bd09bSSatish Balay 1546827bd09bSSatish Balay /****************************************************************************** 1547827bd09bSSatish Balay Function: my_sort(). 1548827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1549827bd09bSSatish Balay Output: sorted list (in ascending order). 1550827bd09bSSatish Balay Return: none. 1551827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1552827bd09bSSatish Balay ******************************************************************************/ 1553827bd09bSSatish Balay void 1554*a501084fSBarry Smith rvec_sort( PetscScalar *ar, int Size) 1555827bd09bSSatish Balay { 1556*a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1557*a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1558*a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1559*a501084fSBarry Smith long size = (long) Size; 1560827bd09bSSatish Balay 1561827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1562827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1563827bd09bSSatish Balay size--; 1564827bd09bSSatish Balay 1565827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1566827bd09bSSatish Balay for (;;) 1567827bd09bSSatish Balay { 1568827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1569827bd09bSSatish Balay if (size > SORT_OPT) 1570827bd09bSSatish Balay { 1571827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1572827bd09bSSatish Balay pi = ar+1; 1573827bd09bSSatish Balay pj = ar+size; 1574827bd09bSSatish Balay 1575827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1576827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1577827bd09bSSatish Balay 1578827bd09bSSatish Balay pj = ar+size; 1579827bd09bSSatish Balay 1580827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1581827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1582827bd09bSSatish Balay if (*pi > *pj) 1583827bd09bSSatish Balay {SWAP(*pi,*pj)} 1584827bd09bSSatish Balay if (*ar > *pj) 1585827bd09bSSatish Balay {SWAP(*ar,*pj)} 1586827bd09bSSatish Balay else if (*pi > *ar) 1587827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1588827bd09bSSatish Balay 1589827bd09bSSatish Balay /* partition about pivot_value ... */ 1590827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1591827bd09bSSatish Balay for(;;) 1592827bd09bSSatish Balay { 1593827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1594827bd09bSSatish Balay do pi++; while (*pi<*ar); 1595827bd09bSSatish Balay do pj--; while (*pj>*ar); 1596827bd09bSSatish Balay 1597827bd09bSSatish Balay /* if we've crossed we're done */ 1598827bd09bSSatish Balay if (pj<pi) break; 1599827bd09bSSatish Balay 1600827bd09bSSatish Balay /* else swap */ 1601827bd09bSSatish Balay SWAP(*pi,*pj) 1602827bd09bSSatish Balay } 1603827bd09bSSatish Balay 1604827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1605827bd09bSSatish Balay SWAP(*ar,*pj) 1606827bd09bSSatish Balay 1607827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1608827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1609827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1610827bd09bSSatish Balay 1611827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1612827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1613827bd09bSSatish Balay { 1614827bd09bSSatish Balay *(top_a++) = pi; 1615827bd09bSSatish Balay size -= *top_s+2; 1616827bd09bSSatish Balay top_s++; 1617827bd09bSSatish Balay } 1618827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1619827bd09bSSatish Balay else if (size -= *top_s+2) 1620827bd09bSSatish Balay {;} 1621827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1622827bd09bSSatish Balay else 1623827bd09bSSatish Balay { 1624827bd09bSSatish Balay ar = *(--top_a); 1625827bd09bSSatish Balay size = *(--top_s); 1626827bd09bSSatish Balay } 1627827bd09bSSatish Balay } 1628827bd09bSSatish Balay 1629827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1630827bd09bSSatish Balay else 1631827bd09bSSatish Balay { 1632827bd09bSSatish Balay /* insertion sort for bottom */ 1633827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1634827bd09bSSatish Balay { 1635827bd09bSSatish Balay temp = *pj; 1636827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1637827bd09bSSatish Balay { 1638827bd09bSSatish Balay if (*pi <= temp) break; 1639827bd09bSSatish Balay *(pi+1)=*pi; 1640827bd09bSSatish Balay } 1641827bd09bSSatish Balay *(pi+1)=temp; 1642827bd09bSSatish Balay } 1643827bd09bSSatish Balay 1644827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1645827bd09bSSatish Balay if (top_s==bottom_s) return; 1646827bd09bSSatish Balay 1647827bd09bSSatish Balay /* else pop another list from the stack */ 1648827bd09bSSatish Balay ar = *(--top_a); 1649827bd09bSSatish Balay size = *(--top_s); 1650827bd09bSSatish Balay } 1651827bd09bSSatish Balay } 1652827bd09bSSatish Balay } 1653827bd09bSSatish Balay 1654827bd09bSSatish Balay 1655827bd09bSSatish Balay 1656827bd09bSSatish Balay /****************************************************************************** 1657827bd09bSSatish Balay Function: my_sort(). 1658827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1659827bd09bSSatish Balay Output: sorted list (in ascending order). 1660827bd09bSSatish Balay Return: none. 1661827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1662827bd09bSSatish Balay ******************************************************************************/ 1663827bd09bSSatish Balay void 1664*a501084fSBarry Smith rvec_sort_companion( PetscScalar *ar, int *ar2, int Size) 1665827bd09bSSatish Balay { 1666*a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1667*a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1668*a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1669*a501084fSBarry Smith long size = (long) Size; 1670827bd09bSSatish Balay 1671*a501084fSBarry Smith int *pi2, *pj2; 1672*a501084fSBarry Smith int ptr; 1673*a501084fSBarry Smith long mid; 1674827bd09bSSatish Balay 1675827bd09bSSatish Balay 1676827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1677827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1678827bd09bSSatish Balay size--; 1679827bd09bSSatish Balay 1680827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1681827bd09bSSatish Balay for (;;) 1682827bd09bSSatish Balay { 1683827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1684827bd09bSSatish Balay if (size > SORT_OPT) 1685827bd09bSSatish Balay { 1686827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1687827bd09bSSatish Balay mid = size>>1; 1688827bd09bSSatish Balay pi = ar+1; 1689827bd09bSSatish Balay pj = ar+mid; 1690827bd09bSSatish Balay pi2 = ar2+1; 1691827bd09bSSatish Balay pj2 = ar2+mid; 1692827bd09bSSatish Balay 1693827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1694827bd09bSSatish Balay SWAP(*pi,*pj) 1695827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1696827bd09bSSatish Balay 1697827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1698827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1699827bd09bSSatish Balay pj = ar+size; 1700827bd09bSSatish Balay pj2 = ar2+size; 1701827bd09bSSatish Balay if (*pi > *pj) 1702827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1703827bd09bSSatish Balay if (*ar > *pj) 1704827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1705827bd09bSSatish Balay else if (*pi > *ar) 1706827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1707827bd09bSSatish Balay 1708827bd09bSSatish Balay /* partition about pivot_value ... */ 1709827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1710827bd09bSSatish Balay for(;;) 1711827bd09bSSatish Balay { 1712827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1713827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1714827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1715827bd09bSSatish Balay 1716827bd09bSSatish Balay /* if we've crossed we're done */ 1717827bd09bSSatish Balay if (pj<pi) break; 1718827bd09bSSatish Balay 1719827bd09bSSatish Balay /* else swap */ 1720827bd09bSSatish Balay SWAP(*pi,*pj) 1721827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1722827bd09bSSatish Balay } 1723827bd09bSSatish Balay 1724827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1725827bd09bSSatish Balay SWAP(*ar,*pj) 1726827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1727827bd09bSSatish Balay 1728827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1729827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1730827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1731827bd09bSSatish Balay 1732827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1733827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1734827bd09bSSatish Balay { 1735827bd09bSSatish Balay *(top_a++) = pi; 1736*a501084fSBarry Smith *(top_a++) = (PetscScalar *) pi2; 1737827bd09bSSatish Balay size -= *top_s+2; 1738827bd09bSSatish Balay top_s++; 1739827bd09bSSatish Balay } 1740827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1741827bd09bSSatish Balay else if (size -= *top_s+2) 1742827bd09bSSatish Balay {;} 1743827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1744827bd09bSSatish Balay else 1745827bd09bSSatish Balay { 1746827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1747827bd09bSSatish Balay ar = *(--top_a); 1748827bd09bSSatish Balay size = *(--top_s); 1749827bd09bSSatish Balay } 1750827bd09bSSatish Balay } 1751827bd09bSSatish Balay 1752827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1753827bd09bSSatish Balay else 1754827bd09bSSatish Balay { 1755827bd09bSSatish Balay /* insertion sort for bottom */ 1756827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1757827bd09bSSatish Balay { 1758827bd09bSSatish Balay temp = *pj; 1759827bd09bSSatish Balay ptr = *pj2; 1760827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1761827bd09bSSatish Balay { 1762827bd09bSSatish Balay if (*pi <= temp) break; 1763827bd09bSSatish Balay *(pi+1)=*pi; 1764827bd09bSSatish Balay *(pi2+1)=*pi2; 1765827bd09bSSatish Balay } 1766827bd09bSSatish Balay *(pi+1)=temp; 1767827bd09bSSatish Balay *(pi2+1)=ptr; 1768827bd09bSSatish Balay } 1769827bd09bSSatish Balay 1770827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1771827bd09bSSatish Balay if (top_s==bottom_s) return; 1772827bd09bSSatish Balay 1773827bd09bSSatish Balay /* else pop another list from the stack */ 1774827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1775827bd09bSSatish Balay ar = *(--top_a); 1776827bd09bSSatish Balay size = *(--top_s); 1777827bd09bSSatish Balay } 1778827bd09bSSatish Balay } 1779827bd09bSSatish Balay } 1780827bd09bSSatish Balay 1781827bd09bSSatish Balay 1782827bd09bSSatish Balay 1783827bd09bSSatish Balay 1784827bd09bSSatish Balay 1785827bd09bSSatish Balay /**********************************ivec.c************************************** 1786827bd09bSSatish Balay Function ivec_binary_search() 1787827bd09bSSatish Balay 1788827bd09bSSatish Balay Input : 1789827bd09bSSatish Balay Output: 1790827bd09bSSatish Balay Return: 1791827bd09bSSatish Balay Description: 1792827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1793827bd09bSSatish Balay int 1794*a501084fSBarry Smith rvec_binary_search( PetscScalar item, PetscScalar *list, int rh) 1795827bd09bSSatish Balay { 1796*a501084fSBarry Smith int mid, lh=0; 1797827bd09bSSatish Balay 1798827bd09bSSatish Balay rh--; 1799827bd09bSSatish Balay while (lh<=rh) 1800827bd09bSSatish Balay { 1801827bd09bSSatish Balay mid = (lh+rh)>>1; 1802827bd09bSSatish Balay if (*(list+mid) == item) 1803827bd09bSSatish Balay {return(mid);} 1804827bd09bSSatish Balay if (*(list+mid) > item) 1805827bd09bSSatish Balay {rh = mid-1;} 1806827bd09bSSatish Balay else 1807827bd09bSSatish Balay {lh = mid+1;} 1808827bd09bSSatish Balay } 1809827bd09bSSatish Balay return(-1); 1810827bd09bSSatish Balay } 1811827bd09bSSatish Balay 1812827bd09bSSatish Balay 1813827bd09bSSatish Balay 1814827bd09bSSatish Balay 1815827bd09bSSatish Balay 1816