1*dba47a55SKris Buschelman #define PETSCKSP_DLL 2827bd09bSSatish Balay 3827bd09bSSatish Balay /**********************************ivec.c************************************** 4827bd09bSSatish Balay 5827bd09bSSatish Balay Author: Henry M. Tufo III 6827bd09bSSatish Balay 7827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 8827bd09bSSatish Balay 9827bd09bSSatish Balay snail-mail: 10827bd09bSSatish Balay Division of Applied Mathematics 11827bd09bSSatish Balay Brown University 12827bd09bSSatish Balay Providence, RI 02912 13827bd09bSSatish Balay 14827bd09bSSatish Balay Last Modification: 15827bd09bSSatish Balay 6.21.97 16827bd09bSSatish Balay ***********************************ivec.c*************************************/ 17827bd09bSSatish Balay 18827bd09bSSatish Balay /**********************************ivec.c************************************** 19827bd09bSSatish Balay File Description: 20827bd09bSSatish Balay ----------------- 21827bd09bSSatish Balay 22827bd09bSSatish Balay ***********************************ivec.c*************************************/ 237758a8cdSBarry Smith #include "src/ksp/pc/impls/tfs/tfs.h" 24827bd09bSSatish Balay 25827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 26827bd09bSSatish Balay #define SORT_OPT 6 27827bd09bSSatish Balay #define SORT_STACK 50000 28827bd09bSSatish Balay 29827bd09bSSatish Balay 30827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 31827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 32827bd09bSSatish Balay static int size_stack[SORT_STACK]; 33a501084fSBarry Smith static long psize_stack[SORT_STACK]; 34827bd09bSSatish Balay 35827bd09bSSatish Balay 36827bd09bSSatish Balay 37827bd09bSSatish Balay /**********************************ivec.c************************************** 38827bd09bSSatish Balay Function ivec_dump() 39827bd09bSSatish Balay 40827bd09bSSatish Balay Input : 41827bd09bSSatish Balay Output: 42827bd09bSSatish Balay Return: 43827bd09bSSatish Balay Description: 44827bd09bSSatish Balay ***********************************ivec.c*************************************/ 45827bd09bSSatish Balay void 46827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s) 47827bd09bSSatish Balay { 48827bd09bSSatish Balay int i; 49827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 50827bd09bSSatish Balay for (i=0;i<n;i++) 51827bd09bSSatish Balay {printf("%2d ",v[i]);} 52827bd09bSSatish Balay printf("\n"); 53827bd09bSSatish Balay fflush(stdout); 54827bd09bSSatish Balay } 55827bd09bSSatish Balay 56827bd09bSSatish Balay 57827bd09bSSatish Balay 58827bd09bSSatish Balay /**********************************ivec.c************************************** 59827bd09bSSatish Balay Function ivec_lb_ub() 60827bd09bSSatish Balay 61827bd09bSSatish Balay Input : 62827bd09bSSatish Balay Output: 63827bd09bSSatish Balay Return: 64827bd09bSSatish Balay Description: 65827bd09bSSatish Balay ***********************************ivec.c*************************************/ 66827bd09bSSatish Balay void 67a501084fSBarry Smith ivec_lb_ub( int *arg1, int n, int *lb, int *ub) 68827bd09bSSatish Balay { 69a501084fSBarry Smith int min = INT_MAX; 70a501084fSBarry Smith int max = INT_MIN; 71827bd09bSSatish Balay 72827bd09bSSatish Balay while (n--) 73827bd09bSSatish Balay { 7439945688SSatish Balay min = PetscMin(min,*arg1); 7539945688SSatish Balay max = PetscMax(max,*arg1); 76827bd09bSSatish Balay arg1++; 77827bd09bSSatish Balay } 78827bd09bSSatish Balay 79827bd09bSSatish Balay *lb=min; 80827bd09bSSatish Balay *ub=max; 81827bd09bSSatish Balay } 82827bd09bSSatish Balay 83827bd09bSSatish Balay 84827bd09bSSatish Balay 85827bd09bSSatish Balay /**********************************ivec.c************************************** 86827bd09bSSatish Balay Function ivec_copy() 87827bd09bSSatish Balay 88827bd09bSSatish Balay Input : 89827bd09bSSatish Balay Output: 90827bd09bSSatish Balay Return: 91827bd09bSSatish Balay Description: 92827bd09bSSatish Balay ***********************************ivec.c*************************************/ 93a501084fSBarry Smith int *ivec_copy( int *arg1, int *arg2, int n) 94827bd09bSSatish Balay { 95827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 96827bd09bSSatish Balay return(arg1); 97827bd09bSSatish Balay } 98827bd09bSSatish Balay 99827bd09bSSatish Balay 100827bd09bSSatish Balay 101827bd09bSSatish Balay /**********************************ivec.c************************************** 102827bd09bSSatish Balay Function ivec_zero() 103827bd09bSSatish Balay 104827bd09bSSatish Balay Input : 105827bd09bSSatish Balay Output: 106827bd09bSSatish Balay Return: 107827bd09bSSatish Balay Description: 108827bd09bSSatish Balay ***********************************ivec.c*************************************/ 109827bd09bSSatish Balay void 110a501084fSBarry Smith ivec_zero( int *arg1, int n) 111827bd09bSSatish Balay { 112827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 113827bd09bSSatish Balay } 114827bd09bSSatish Balay 115827bd09bSSatish Balay 116827bd09bSSatish Balay 117827bd09bSSatish Balay /**********************************ivec.c************************************** 118827bd09bSSatish Balay Function ivec_comp() 119827bd09bSSatish Balay 120827bd09bSSatish Balay Input : 121827bd09bSSatish Balay Output: 122827bd09bSSatish Balay Return: 123827bd09bSSatish Balay Description: 124827bd09bSSatish Balay ***********************************ivec.c*************************************/ 125827bd09bSSatish Balay void 126a501084fSBarry Smith ivec_comp( int *arg1, int n) 127827bd09bSSatish Balay { 128827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 129827bd09bSSatish Balay } 130827bd09bSSatish Balay 131827bd09bSSatish Balay 132827bd09bSSatish Balay 133827bd09bSSatish Balay /**********************************ivec.c************************************** 134827bd09bSSatish Balay Function ivec_neg_one() 135827bd09bSSatish Balay 136827bd09bSSatish Balay Input : 137827bd09bSSatish Balay Output: 138827bd09bSSatish Balay Return: 139827bd09bSSatish Balay Description: 140827bd09bSSatish Balay ***********************************ivec.c*************************************/ 141827bd09bSSatish Balay void 142a501084fSBarry Smith ivec_neg_one( int *arg1, int n) 143827bd09bSSatish Balay { 144827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 145827bd09bSSatish Balay } 146827bd09bSSatish Balay 147827bd09bSSatish Balay 148827bd09bSSatish Balay 149827bd09bSSatish Balay /**********************************ivec.c************************************** 150827bd09bSSatish Balay Function ivec_pos_one() 151827bd09bSSatish Balay 152827bd09bSSatish Balay Input : 153827bd09bSSatish Balay Output: 154827bd09bSSatish Balay Return: 155827bd09bSSatish Balay Description: 156827bd09bSSatish Balay ***********************************ivec.c*************************************/ 157827bd09bSSatish Balay void 158a501084fSBarry Smith ivec_pos_one( int *arg1, int n) 159827bd09bSSatish Balay { 160827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 161827bd09bSSatish Balay } 162827bd09bSSatish Balay 163827bd09bSSatish Balay 164827bd09bSSatish Balay 165827bd09bSSatish Balay /**********************************ivec.c************************************** 166827bd09bSSatish Balay Function ivec_c_index() 167827bd09bSSatish Balay 168827bd09bSSatish Balay Input : 169827bd09bSSatish Balay Output: 170827bd09bSSatish Balay Return: 171827bd09bSSatish Balay Description: 172827bd09bSSatish Balay ***********************************ivec.c*************************************/ 173827bd09bSSatish Balay void 174a501084fSBarry Smith ivec_c_index( int *arg1, int n) 175827bd09bSSatish Balay { 176a501084fSBarry Smith int i=0; 177827bd09bSSatish Balay 178827bd09bSSatish Balay 179827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 180827bd09bSSatish Balay } 181827bd09bSSatish Balay 182827bd09bSSatish Balay 183827bd09bSSatish Balay 184827bd09bSSatish Balay /**********************************ivec.c************************************** 185827bd09bSSatish Balay Function ivec_fortran_index() 186827bd09bSSatish Balay 187827bd09bSSatish Balay Input : 188827bd09bSSatish Balay Output: 189827bd09bSSatish Balay Return: 190827bd09bSSatish Balay Description: 191827bd09bSSatish Balay ***********************************ivec.c*************************************/ 192827bd09bSSatish Balay void 193a501084fSBarry Smith ivec_fortran_index( int *arg1, int n) 194827bd09bSSatish Balay { 195a501084fSBarry Smith int i=0; 196827bd09bSSatish Balay 197827bd09bSSatish Balay 198827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 199827bd09bSSatish Balay } 200827bd09bSSatish Balay 201827bd09bSSatish Balay 202827bd09bSSatish Balay 203827bd09bSSatish Balay /**********************************ivec.c************************************** 204827bd09bSSatish Balay Function ivec_set() 205827bd09bSSatish Balay 206827bd09bSSatish Balay Input : 207827bd09bSSatish Balay Output: 208827bd09bSSatish Balay Return: 209827bd09bSSatish Balay Description: 210827bd09bSSatish Balay ***********************************ivec.c*************************************/ 211827bd09bSSatish Balay void 212a501084fSBarry Smith ivec_set( int *arg1, int arg2, int n) 213827bd09bSSatish Balay { 214827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 215827bd09bSSatish Balay } 216827bd09bSSatish Balay 217827bd09bSSatish Balay 218827bd09bSSatish Balay 219827bd09bSSatish Balay /**********************************ivec.c************************************** 220827bd09bSSatish Balay Function ivec_cmp() 221827bd09bSSatish Balay 222827bd09bSSatish Balay Input : 223827bd09bSSatish Balay Output: 224827bd09bSSatish Balay Return: 225827bd09bSSatish Balay Description: 226827bd09bSSatish Balay ***********************************ivec.c*************************************/ 227827bd09bSSatish Balay int 228a501084fSBarry Smith ivec_cmp( int *arg1, int *arg2, int n) 229827bd09bSSatish Balay { 230827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 231827bd09bSSatish Balay return(TRUE); 232827bd09bSSatish Balay } 233827bd09bSSatish Balay 234827bd09bSSatish Balay 235827bd09bSSatish Balay 236827bd09bSSatish Balay /**********************************ivec.c************************************** 237827bd09bSSatish Balay Function ivec_max() 238827bd09bSSatish Balay 239827bd09bSSatish Balay Input : 240827bd09bSSatish Balay Output: 241827bd09bSSatish Balay Return: 242827bd09bSSatish Balay Description: 243827bd09bSSatish Balay ***********************************ivec.c*************************************/ 244827bd09bSSatish Balay void 245a501084fSBarry Smith ivec_max( int *arg1, int *arg2, int n) 246827bd09bSSatish Balay { 24739945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 248827bd09bSSatish Balay } 249827bd09bSSatish Balay 250827bd09bSSatish Balay 251827bd09bSSatish Balay 252827bd09bSSatish Balay /**********************************ivec.c************************************** 253827bd09bSSatish Balay Function ivec_min() 254827bd09bSSatish Balay 255827bd09bSSatish Balay Input : 256827bd09bSSatish Balay Output: 257827bd09bSSatish Balay Return: 258827bd09bSSatish Balay Description: 259827bd09bSSatish Balay ***********************************ivec.c*************************************/ 260827bd09bSSatish Balay void 261a501084fSBarry Smith ivec_min( int *arg1, int *arg2, int n) 262827bd09bSSatish Balay { 26339945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 264827bd09bSSatish Balay } 265827bd09bSSatish Balay 266827bd09bSSatish Balay 267827bd09bSSatish Balay 268827bd09bSSatish Balay /**********************************ivec.c************************************** 269827bd09bSSatish Balay Function ivec_mult() 270827bd09bSSatish Balay 271827bd09bSSatish Balay Input : 272827bd09bSSatish Balay Output: 273827bd09bSSatish Balay Return: 274827bd09bSSatish Balay Description: 275827bd09bSSatish Balay ***********************************ivec.c*************************************/ 276827bd09bSSatish Balay void 277a501084fSBarry Smith ivec_mult( int *arg1, int *arg2, int n) 278827bd09bSSatish Balay { 279827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 280827bd09bSSatish Balay } 281827bd09bSSatish Balay 282827bd09bSSatish Balay 283827bd09bSSatish Balay 284827bd09bSSatish Balay /**********************************ivec.c************************************** 285827bd09bSSatish Balay Function ivec_add() 286827bd09bSSatish Balay 287827bd09bSSatish Balay Input : 288827bd09bSSatish Balay Output: 289827bd09bSSatish Balay Return: 290827bd09bSSatish Balay Description: 291827bd09bSSatish Balay ***********************************ivec.c*************************************/ 292827bd09bSSatish Balay void 293a501084fSBarry Smith ivec_add( int *arg1, int *arg2, int n) 294827bd09bSSatish Balay { 295827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 296827bd09bSSatish Balay } 297827bd09bSSatish Balay 298827bd09bSSatish Balay 299827bd09bSSatish Balay 300827bd09bSSatish Balay /**********************************ivec.c************************************** 301827bd09bSSatish Balay Function ivec_lxor() 302827bd09bSSatish Balay 303827bd09bSSatish Balay Input : 304827bd09bSSatish Balay Output: 305827bd09bSSatish Balay Return: 306827bd09bSSatish Balay Description: 307827bd09bSSatish Balay ***********************************ivec.c*************************************/ 308827bd09bSSatish Balay void 309a501084fSBarry Smith ivec_lxor( int *arg1, int *arg2, int n) 310827bd09bSSatish Balay { 311827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 312827bd09bSSatish Balay } 313827bd09bSSatish Balay 314827bd09bSSatish Balay 315827bd09bSSatish Balay 316827bd09bSSatish Balay /**********************************ivec.c************************************** 317827bd09bSSatish Balay Function ivec_xor() 318827bd09bSSatish Balay 319827bd09bSSatish Balay Input : 320827bd09bSSatish Balay Output: 321827bd09bSSatish Balay Return: 322827bd09bSSatish Balay Description: 323827bd09bSSatish Balay ***********************************ivec.c*************************************/ 324827bd09bSSatish Balay void 325a501084fSBarry Smith ivec_xor( int *arg1, int *arg2, int n) 326827bd09bSSatish Balay { 327827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 328827bd09bSSatish Balay } 329827bd09bSSatish Balay 330827bd09bSSatish Balay 331827bd09bSSatish Balay 332827bd09bSSatish Balay /**********************************ivec.c************************************** 333827bd09bSSatish Balay Function ivec_or() 334827bd09bSSatish Balay 335827bd09bSSatish Balay Input : 336827bd09bSSatish Balay Output: 337827bd09bSSatish Balay Return: 338827bd09bSSatish Balay Description: 339827bd09bSSatish Balay ***********************************ivec.c*************************************/ 340827bd09bSSatish Balay void 341a501084fSBarry Smith ivec_or( int *arg1, int *arg2, int n) 342827bd09bSSatish Balay { 343827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 344827bd09bSSatish Balay } 345827bd09bSSatish Balay 346827bd09bSSatish Balay 347827bd09bSSatish Balay 348827bd09bSSatish Balay /**********************************ivec.c************************************** 349827bd09bSSatish Balay Function ivec_lor() 350827bd09bSSatish Balay 351827bd09bSSatish Balay Input : 352827bd09bSSatish Balay Output: 353827bd09bSSatish Balay Return: 354827bd09bSSatish Balay Description: 355827bd09bSSatish Balay ***********************************ivec.c*************************************/ 356827bd09bSSatish Balay void 357a501084fSBarry Smith ivec_lor( int *arg1, int *arg2, int n) 358827bd09bSSatish Balay { 359827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 360827bd09bSSatish Balay } 361827bd09bSSatish Balay 362827bd09bSSatish Balay 363827bd09bSSatish Balay 364827bd09bSSatish Balay /**********************************ivec.c************************************** 365827bd09bSSatish Balay Function ivec_or3() 366827bd09bSSatish Balay 367827bd09bSSatish Balay Input : 368827bd09bSSatish Balay Output: 369827bd09bSSatish Balay Return: 370827bd09bSSatish Balay Description: 371827bd09bSSatish Balay ***********************************ivec.c*************************************/ 372827bd09bSSatish Balay void 373a501084fSBarry Smith ivec_or3( int *arg1, int *arg2, int *arg3, 374a501084fSBarry Smith int n) 375827bd09bSSatish Balay { 376827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 377827bd09bSSatish Balay } 378827bd09bSSatish Balay 379827bd09bSSatish Balay 380827bd09bSSatish Balay 381827bd09bSSatish Balay /**********************************ivec.c************************************** 382827bd09bSSatish Balay Function ivec_and() 383827bd09bSSatish Balay 384827bd09bSSatish Balay Input : 385827bd09bSSatish Balay Output: 386827bd09bSSatish Balay Return: 387827bd09bSSatish Balay Description: 388827bd09bSSatish Balay ***********************************ivec.c*************************************/ 389827bd09bSSatish Balay void 390a501084fSBarry Smith ivec_and( int *arg1, int *arg2, int n) 391827bd09bSSatish Balay { 392827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 393827bd09bSSatish Balay } 394827bd09bSSatish Balay 395827bd09bSSatish Balay 396827bd09bSSatish Balay 397827bd09bSSatish Balay /**********************************ivec.c************************************** 398827bd09bSSatish Balay Function ivec_land() 399827bd09bSSatish Balay 400827bd09bSSatish Balay Input : 401827bd09bSSatish Balay Output: 402827bd09bSSatish Balay Return: 403827bd09bSSatish Balay Description: 404827bd09bSSatish Balay ***********************************ivec.c*************************************/ 405827bd09bSSatish Balay void 406a501084fSBarry Smith ivec_land( int *arg1, int *arg2, int n) 407827bd09bSSatish Balay { 408827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 409827bd09bSSatish Balay } 410827bd09bSSatish Balay 411827bd09bSSatish Balay 412827bd09bSSatish Balay 413827bd09bSSatish Balay /**********************************ivec.c************************************** 414827bd09bSSatish Balay Function ivec_and3() 415827bd09bSSatish Balay 416827bd09bSSatish Balay Input : 417827bd09bSSatish Balay Output: 418827bd09bSSatish Balay Return: 419827bd09bSSatish Balay Description: 420827bd09bSSatish Balay ***********************************ivec.c*************************************/ 421827bd09bSSatish Balay void 422a501084fSBarry Smith ivec_and3( int *arg1, int *arg2, int *arg3, 423a501084fSBarry Smith int n) 424827bd09bSSatish Balay { 425827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 426827bd09bSSatish Balay } 427827bd09bSSatish Balay 428827bd09bSSatish Balay 429827bd09bSSatish Balay 430827bd09bSSatish Balay /**********************************ivec.c************************************** 431827bd09bSSatish Balay Function ivec_sum 432827bd09bSSatish Balay 433827bd09bSSatish Balay Input : 434827bd09bSSatish Balay Output: 435827bd09bSSatish Balay Return: 436827bd09bSSatish Balay Description: 437827bd09bSSatish Balay ***********************************ivec.c*************************************/ 438a501084fSBarry Smith int ivec_sum( int *arg1, int n) 439827bd09bSSatish Balay { 440a501084fSBarry Smith int tmp = 0; 441827bd09bSSatish Balay 442827bd09bSSatish Balay 443827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 444827bd09bSSatish Balay return(tmp); 445827bd09bSSatish Balay } 446827bd09bSSatish Balay 447827bd09bSSatish Balay 448827bd09bSSatish Balay 449827bd09bSSatish Balay /**********************************ivec.c************************************** 450827bd09bSSatish Balay Function ivec_reduce_and 451827bd09bSSatish Balay 452827bd09bSSatish Balay Input : 453827bd09bSSatish Balay Output: 454827bd09bSSatish Balay Return: 455827bd09bSSatish Balay Description: 456827bd09bSSatish Balay ***********************************ivec.c*************************************/ 457a501084fSBarry Smith int ivec_reduce_and( int *arg1, int n) 458827bd09bSSatish Balay { 459a501084fSBarry Smith int tmp = ALL_ONES; 460827bd09bSSatish Balay 461827bd09bSSatish Balay 462827bd09bSSatish Balay while (n--) {tmp &= *arg1++;} 463827bd09bSSatish Balay return(tmp); 464827bd09bSSatish Balay } 465827bd09bSSatish Balay 466827bd09bSSatish Balay 467827bd09bSSatish Balay 468827bd09bSSatish Balay /**********************************ivec.c************************************** 469827bd09bSSatish Balay Function ivec_reduce_or 470827bd09bSSatish Balay 471827bd09bSSatish Balay Input : 472827bd09bSSatish Balay Output: 473827bd09bSSatish Balay Return: 474827bd09bSSatish Balay Description: 475827bd09bSSatish Balay ***********************************ivec.c*************************************/ 476a501084fSBarry Smith int ivec_reduce_or( int *arg1, int n) 477827bd09bSSatish Balay { 478a501084fSBarry Smith int tmp = 0; 479827bd09bSSatish Balay 480827bd09bSSatish Balay 481827bd09bSSatish Balay while (n--) {tmp |= *arg1++;} 482827bd09bSSatish Balay return(tmp); 483827bd09bSSatish Balay } 484827bd09bSSatish Balay 485827bd09bSSatish Balay 486827bd09bSSatish Balay 487827bd09bSSatish Balay /**********************************ivec.c************************************** 488827bd09bSSatish Balay Function ivec_prod 489827bd09bSSatish Balay 490827bd09bSSatish Balay Input : 491827bd09bSSatish Balay Output: 492827bd09bSSatish Balay Return: 493827bd09bSSatish Balay Description: 494827bd09bSSatish Balay ***********************************ivec.c*************************************/ 495a501084fSBarry Smith int ivec_prod( int *arg1, int n) 496827bd09bSSatish Balay { 497a501084fSBarry Smith int tmp = 1; 498827bd09bSSatish Balay 499827bd09bSSatish Balay 500827bd09bSSatish Balay while (n--) {tmp *= *arg1++;} 501827bd09bSSatish Balay return(tmp); 502827bd09bSSatish Balay } 503827bd09bSSatish Balay 504827bd09bSSatish Balay 505827bd09bSSatish Balay 506827bd09bSSatish Balay /**********************************ivec.c************************************** 507827bd09bSSatish Balay Function ivec_u_sum 508827bd09bSSatish Balay 509827bd09bSSatish Balay Input : 510827bd09bSSatish Balay Output: 511827bd09bSSatish Balay Return: 512827bd09bSSatish Balay Description: 513827bd09bSSatish Balay ***********************************ivec.c*************************************/ 514a501084fSBarry Smith int ivec_u_sum( unsigned *arg1, int n) 515827bd09bSSatish Balay { 516a501084fSBarry Smith unsigned tmp = 0; 517827bd09bSSatish Balay 518827bd09bSSatish Balay 519827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 520827bd09bSSatish Balay return(tmp); 521827bd09bSSatish Balay } 522827bd09bSSatish Balay 523827bd09bSSatish Balay 524827bd09bSSatish Balay 525827bd09bSSatish Balay /**********************************ivec.c************************************** 526827bd09bSSatish Balay Function ivec_lb() 527827bd09bSSatish Balay 528827bd09bSSatish Balay Input : 529827bd09bSSatish Balay Output: 530827bd09bSSatish Balay Return: 531827bd09bSSatish Balay Description: 532827bd09bSSatish Balay ***********************************ivec.c*************************************/ 533827bd09bSSatish Balay int 534a501084fSBarry Smith ivec_lb( int *arg1, int n) 535827bd09bSSatish Balay { 536a501084fSBarry Smith int min = INT_MAX; 537827bd09bSSatish Balay 538827bd09bSSatish Balay 53939945688SSatish Balay while (n--) {min = PetscMin(min,*arg1); arg1++;} 540827bd09bSSatish Balay return(min); 541827bd09bSSatish Balay } 542827bd09bSSatish Balay 543827bd09bSSatish Balay 544827bd09bSSatish Balay 545827bd09bSSatish Balay /**********************************ivec.c************************************** 546827bd09bSSatish Balay Function ivec_ub() 547827bd09bSSatish Balay 548827bd09bSSatish Balay Input : 549827bd09bSSatish Balay Output: 550827bd09bSSatish Balay Return: 551827bd09bSSatish Balay Description: 552827bd09bSSatish Balay ***********************************ivec.c*************************************/ 553827bd09bSSatish Balay int 554a501084fSBarry Smith ivec_ub( int *arg1, int n) 555827bd09bSSatish Balay { 556a501084fSBarry Smith int max = INT_MIN; 557827bd09bSSatish Balay 558827bd09bSSatish Balay 55939945688SSatish Balay while (n--) {max = PetscMax(max,*arg1); arg1++;} 560827bd09bSSatish Balay return(max); 561827bd09bSSatish Balay } 562827bd09bSSatish Balay 563827bd09bSSatish Balay 564827bd09bSSatish Balay 565827bd09bSSatish Balay /**********************************ivec.c************************************** 566827bd09bSSatish Balay Function split_buf() 567827bd09bSSatish Balay 568827bd09bSSatish Balay Input : 569827bd09bSSatish Balay Output: 570827bd09bSSatish Balay Return: 571827bd09bSSatish Balay Description: 572827bd09bSSatish Balay 573827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 574827bd09bSSatish Balay ***********************************ivec.c*************************************/ 575827bd09bSSatish Balay int 576a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2, int size) 577827bd09bSSatish Balay { 578827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 579827bd09bSSatish Balay return(size); 580827bd09bSSatish Balay } 581827bd09bSSatish Balay 582827bd09bSSatish Balay 583827bd09bSSatish Balay 584827bd09bSSatish Balay /**********************************ivec.c************************************** 585827bd09bSSatish Balay Function ivec_non_uniform() 586827bd09bSSatish Balay 587827bd09bSSatish Balay Input : 588827bd09bSSatish Balay Output: 589827bd09bSSatish Balay Return: 590827bd09bSSatish Balay Description: 591827bd09bSSatish Balay ***********************************ivec.c*************************************/ 592827bd09bSSatish Balay void 593a501084fSBarry Smith ivec_non_uniform(int *arg1, int *arg2, int n, int *arg3) 594827bd09bSSatish Balay { 595a501084fSBarry Smith int i, j, type; 596827bd09bSSatish Balay 597827bd09bSSatish Balay 598827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 599827bd09bSSatish Balay for (i=0;i<n;) 600827bd09bSSatish Balay { 601827bd09bSSatish Balay /* clump 'em for now */ 602827bd09bSSatish Balay j=i+1; 603827bd09bSSatish Balay type = arg3[i]; 604827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 605827bd09bSSatish Balay {j++;} 606827bd09bSSatish Balay 607827bd09bSSatish Balay /* how many together */ 608827bd09bSSatish Balay j -= i; 609827bd09bSSatish Balay 610827bd09bSSatish Balay /* call appropriate ivec function */ 611827bd09bSSatish Balay if (type == GL_MAX) 612827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 613827bd09bSSatish Balay else if (type == GL_MIN) 614827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 615827bd09bSSatish Balay else if (type == GL_MULT) 616827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 617827bd09bSSatish Balay else if (type == GL_ADD) 618827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 619827bd09bSSatish Balay else if (type == GL_B_XOR) 620827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 621827bd09bSSatish Balay else if (type == GL_B_OR) 622827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 623827bd09bSSatish Balay else if (type == GL_B_AND) 624827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 625827bd09bSSatish Balay else if (type == GL_L_XOR) 626827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 627827bd09bSSatish Balay else if (type == GL_L_OR) 628827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 629827bd09bSSatish Balay else if (type == GL_L_AND) 630827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 631827bd09bSSatish Balay else 632827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 633827bd09bSSatish Balay 634827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 635827bd09bSSatish Balay } 636827bd09bSSatish Balay } 637827bd09bSSatish Balay 638827bd09bSSatish Balay 639827bd09bSSatish Balay 640827bd09bSSatish Balay /**********************************ivec.c************************************** 641827bd09bSSatish Balay Function ivec_addr() 642827bd09bSSatish Balay 643827bd09bSSatish Balay Input : 644827bd09bSSatish Balay Output: 645827bd09bSSatish Balay Return: 646827bd09bSSatish Balay Description: 647827bd09bSSatish Balay ***********************************ivec.c*************************************/ 648a501084fSBarry Smith vfp ivec_fct_addr( int type) 649827bd09bSSatish Balay { 650827bd09bSSatish Balay if (type == NON_UNIFORM) 651827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_non_uniform);} 652827bd09bSSatish Balay else if (type == GL_MAX) 653827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_max);} 654827bd09bSSatish Balay else if (type == GL_MIN) 655827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_min);} 656827bd09bSSatish Balay else if (type == GL_MULT) 657827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_mult);} 658827bd09bSSatish Balay else if (type == GL_ADD) 659827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_add);} 660827bd09bSSatish Balay else if (type == GL_B_XOR) 661827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_xor);} 662827bd09bSSatish Balay else if (type == GL_B_OR) 663827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_or);} 664827bd09bSSatish Balay else if (type == GL_B_AND) 665827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_and);} 666827bd09bSSatish Balay else if (type == GL_L_XOR) 667827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lxor);} 668827bd09bSSatish Balay else if (type == GL_L_OR) 669827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_lor);} 670827bd09bSSatish Balay else if (type == GL_L_AND) 671827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&ivec_land);} 672827bd09bSSatish Balay 673827bd09bSSatish Balay /* catch all ... not good if we get here */ 674827bd09bSSatish Balay return(NULL); 675827bd09bSSatish Balay } 676827bd09bSSatish Balay 677827bd09bSSatish Balay 678827bd09bSSatish Balay /**********************************ivec.c************************************** 679827bd09bSSatish Balay Function ct_bits() 680827bd09bSSatish Balay 681827bd09bSSatish Balay Input : 682827bd09bSSatish Balay Output: 683827bd09bSSatish Balay Return: 684827bd09bSSatish Balay Description: MUST FIX THIS!!! 685827bd09bSSatish Balay ***********************************ivec.c*************************************/ 686827bd09bSSatish Balay #if defined(notusing) 687827bd09bSSatish Balay static 688827bd09bSSatish Balay int 689a501084fSBarry Smith ivec_ct_bits( int *ptr, int n) 690827bd09bSSatish Balay { 691a501084fSBarry Smith int tmp=0; 692827bd09bSSatish Balay 693827bd09bSSatish Balay 694827bd09bSSatish Balay /* should expand to full 32 bit */ 695827bd09bSSatish Balay while (n--) 696827bd09bSSatish Balay { 697827bd09bSSatish Balay if (*ptr&128) {tmp++;} 698827bd09bSSatish Balay if (*ptr&64) {tmp++;} 699827bd09bSSatish Balay if (*ptr&32) {tmp++;} 700827bd09bSSatish Balay if (*ptr&16) {tmp++;} 701827bd09bSSatish Balay if (*ptr&8) {tmp++;} 702827bd09bSSatish Balay if (*ptr&4) {tmp++;} 703827bd09bSSatish Balay if (*ptr&2) {tmp++;} 704827bd09bSSatish Balay if (*ptr&1) {tmp++;} 705827bd09bSSatish Balay ptr++; 706827bd09bSSatish Balay } 707827bd09bSSatish Balay 708827bd09bSSatish Balay return(tmp); 709827bd09bSSatish Balay } 710827bd09bSSatish Balay #endif 711827bd09bSSatish Balay 712827bd09bSSatish Balay 713827bd09bSSatish Balay /****************************************************************************** 714827bd09bSSatish Balay Function: ivec_sort(). 715827bd09bSSatish Balay 716827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 717827bd09bSSatish Balay Output: sorted list (in ascending order). 718827bd09bSSatish Balay Return: none. 719827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 720827bd09bSSatish Balay ******************************************************************************/ 721827bd09bSSatish Balay void 722a501084fSBarry Smith ivec_sort( int *ar, int size) 723827bd09bSSatish Balay { 724a501084fSBarry Smith int *pi, *pj, temp; 725a501084fSBarry Smith int **top_a = (int **) offset_stack; 726a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 727827bd09bSSatish Balay 728827bd09bSSatish Balay 729827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 730827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 731827bd09bSSatish Balay size--; 732827bd09bSSatish Balay 733827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 734827bd09bSSatish Balay for (;;) 735827bd09bSSatish Balay { 736827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 737827bd09bSSatish Balay if (size > SORT_OPT) 738827bd09bSSatish Balay { 739827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 740827bd09bSSatish Balay pi = ar+1; 741827bd09bSSatish Balay pj = ar+size; 742827bd09bSSatish Balay 743827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 744827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 745827bd09bSSatish Balay 746827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 747827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 748827bd09bSSatish Balay if (*pi > *pj) 749827bd09bSSatish Balay {SWAP(*pi,*pj)} 750827bd09bSSatish Balay if (*ar > *pj) 751827bd09bSSatish Balay {SWAP(*ar,*pj)} 752827bd09bSSatish Balay else if (*pi > *ar) 753827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 754827bd09bSSatish Balay 755827bd09bSSatish Balay /* partition about pivot_value ... */ 756827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 757827bd09bSSatish Balay for(;;) 758827bd09bSSatish Balay { 759827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 760827bd09bSSatish Balay do pi++; while (*pi<*ar); 761827bd09bSSatish Balay do pj--; while (*pj>*ar); 762827bd09bSSatish Balay 763827bd09bSSatish Balay /* if we've crossed we're done */ 764827bd09bSSatish Balay if (pj<pi) break; 765827bd09bSSatish Balay 766827bd09bSSatish Balay /* else swap */ 767827bd09bSSatish Balay SWAP(*pi,*pj) 768827bd09bSSatish Balay } 769827bd09bSSatish Balay 770827bd09bSSatish Balay /* place pivot_value in it's correct location */ 771827bd09bSSatish Balay SWAP(*ar,*pj) 772827bd09bSSatish Balay 773827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 774827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 775827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 776827bd09bSSatish Balay 777827bd09bSSatish Balay /* push right hand child iff length > 1 */ 778827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 779827bd09bSSatish Balay { 780827bd09bSSatish Balay *(top_a++) = pi; 781827bd09bSSatish Balay size -= *top_s+2; 782827bd09bSSatish Balay top_s++; 783827bd09bSSatish Balay } 784827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 785827bd09bSSatish Balay else if (size -= *top_s+2) 786827bd09bSSatish Balay {;} 787827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 788827bd09bSSatish Balay else 789827bd09bSSatish Balay { 790827bd09bSSatish Balay ar = *(--top_a); 791827bd09bSSatish Balay size = *(--top_s); 792827bd09bSSatish Balay } 793827bd09bSSatish Balay } 794827bd09bSSatish Balay 795827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 796827bd09bSSatish Balay else 797827bd09bSSatish Balay { 798827bd09bSSatish Balay /* insertion sort for bottom */ 799827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 800827bd09bSSatish Balay { 801827bd09bSSatish Balay temp = *pj; 802827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 803827bd09bSSatish Balay { 804827bd09bSSatish Balay if (*pi <= temp) break; 805827bd09bSSatish Balay *(pi+1)=*pi; 806827bd09bSSatish Balay } 807827bd09bSSatish Balay *(pi+1)=temp; 808827bd09bSSatish Balay } 809827bd09bSSatish Balay 810827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 811827bd09bSSatish Balay if (top_s==bottom_s) return; 812827bd09bSSatish Balay 813827bd09bSSatish Balay /* else pop another list from the stack */ 814827bd09bSSatish Balay ar = *(--top_a); 815827bd09bSSatish Balay size = *(--top_s); 816827bd09bSSatish Balay } 817827bd09bSSatish Balay } 818827bd09bSSatish Balay } 819827bd09bSSatish Balay 820827bd09bSSatish Balay 821827bd09bSSatish Balay 822827bd09bSSatish Balay /****************************************************************************** 823827bd09bSSatish Balay Function: ivec_sort_companion(). 824827bd09bSSatish Balay 825827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 826827bd09bSSatish Balay Output: sorted list (in ascending order). 827827bd09bSSatish Balay Return: none. 828827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 829827bd09bSSatish Balay ******************************************************************************/ 830827bd09bSSatish Balay void 831a501084fSBarry Smith ivec_sort_companion( int *ar, int *ar2, int size) 832827bd09bSSatish Balay { 833a501084fSBarry Smith int *pi, *pj, temp, temp2; 834a501084fSBarry Smith int **top_a = (int **)offset_stack; 835a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 836a501084fSBarry Smith int *pi2, *pj2; 837a501084fSBarry Smith int mid; 838827bd09bSSatish Balay 839827bd09bSSatish Balay 840827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 841827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 842827bd09bSSatish Balay size--; 843827bd09bSSatish Balay 844827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 845827bd09bSSatish Balay for (;;) 846827bd09bSSatish Balay { 847827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 848827bd09bSSatish Balay if (size > SORT_OPT) 849827bd09bSSatish Balay { 850827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 851827bd09bSSatish Balay mid = size>>1; 852827bd09bSSatish Balay pi = ar+1; 853827bd09bSSatish Balay pj = ar+mid; 854827bd09bSSatish Balay pi2 = ar2+1; 855827bd09bSSatish Balay pj2 = ar2+mid; 856827bd09bSSatish Balay 857827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 858827bd09bSSatish Balay SWAP(*pi,*pj) 859827bd09bSSatish Balay SWAP(*pi2,*pj2) 860827bd09bSSatish Balay 861827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 862827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 863827bd09bSSatish Balay pj = ar+size; 864827bd09bSSatish Balay pj2 = ar2+size; 865827bd09bSSatish Balay if (*pi > *pj) 866827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 867827bd09bSSatish Balay if (*ar > *pj) 868827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 869827bd09bSSatish Balay else if (*pi > *ar) 870827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 871827bd09bSSatish Balay 872827bd09bSSatish Balay /* partition about pivot_value ... */ 873827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 874827bd09bSSatish Balay for(;;) 875827bd09bSSatish Balay { 876827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 877827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 878827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 879827bd09bSSatish Balay 880827bd09bSSatish Balay /* if we've crossed we're done */ 881827bd09bSSatish Balay if (pj<pi) break; 882827bd09bSSatish Balay 883827bd09bSSatish Balay /* else swap */ 884827bd09bSSatish Balay SWAP(*pi,*pj) 885827bd09bSSatish Balay SWAP(*pi2,*pj2) 886827bd09bSSatish Balay } 887827bd09bSSatish Balay 888827bd09bSSatish Balay /* place pivot_value in it's correct location */ 889827bd09bSSatish Balay SWAP(*ar,*pj) 890827bd09bSSatish Balay SWAP(*ar2,*pj2) 891827bd09bSSatish Balay 892827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 893827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 894827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 895827bd09bSSatish Balay 896827bd09bSSatish Balay /* push right hand child iff length > 1 */ 897827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 898827bd09bSSatish Balay { 899827bd09bSSatish Balay *(top_a++) = pi; 900827bd09bSSatish Balay *(top_a++) = pi2; 901827bd09bSSatish Balay size -= *top_s+2; 902827bd09bSSatish Balay top_s++; 903827bd09bSSatish Balay } 904827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 905827bd09bSSatish Balay else if (size -= *top_s+2) 906827bd09bSSatish Balay {;} 907827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 908827bd09bSSatish Balay else 909827bd09bSSatish Balay { 910827bd09bSSatish Balay ar2 = *(--top_a); 911827bd09bSSatish Balay ar = *(--top_a); 912827bd09bSSatish Balay size = *(--top_s); 913827bd09bSSatish Balay } 914827bd09bSSatish Balay } 915827bd09bSSatish Balay 916827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 917827bd09bSSatish Balay else 918827bd09bSSatish Balay { 919827bd09bSSatish Balay /* insertion sort for bottom */ 920827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 921827bd09bSSatish Balay { 922827bd09bSSatish Balay temp = *pj; 923827bd09bSSatish Balay temp2 = *pj2; 924827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 925827bd09bSSatish Balay { 926827bd09bSSatish Balay if (*pi <= temp) break; 927827bd09bSSatish Balay *(pi+1)=*pi; 928827bd09bSSatish Balay *(pi2+1)=*pi2; 929827bd09bSSatish Balay } 930827bd09bSSatish Balay *(pi+1)=temp; 931827bd09bSSatish Balay *(pi2+1)=temp2; 932827bd09bSSatish Balay } 933827bd09bSSatish Balay 934827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 935827bd09bSSatish Balay if (top_s==bottom_s) return; 936827bd09bSSatish Balay 937827bd09bSSatish Balay /* else pop another list from the stack */ 938827bd09bSSatish Balay ar2 = *(--top_a); 939827bd09bSSatish Balay ar = *(--top_a); 940827bd09bSSatish Balay size = *(--top_s); 941827bd09bSSatish Balay } 942827bd09bSSatish Balay } 943827bd09bSSatish Balay } 944827bd09bSSatish Balay 945827bd09bSSatish Balay 946827bd09bSSatish Balay 947827bd09bSSatish Balay /****************************************************************************** 948827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 949827bd09bSSatish Balay 950827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 951827bd09bSSatish Balay Output: sorted list (in ascending order). 952827bd09bSSatish Balay Return: none. 953827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 954827bd09bSSatish Balay ******************************************************************************/ 955827bd09bSSatish Balay void 956a501084fSBarry Smith ivec_sort_companion_hack( int *ar, int **ar2, 957a501084fSBarry Smith int size) 958827bd09bSSatish Balay { 959a501084fSBarry Smith int *pi, *pj, temp, *ptr; 960a501084fSBarry Smith int **top_a = (int **)offset_stack; 961a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 962a501084fSBarry Smith int **pi2, **pj2; 963a501084fSBarry Smith int mid; 964827bd09bSSatish Balay 965827bd09bSSatish Balay 966827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 967827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 968827bd09bSSatish Balay size--; 969827bd09bSSatish Balay 970827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 971827bd09bSSatish Balay for (;;) 972827bd09bSSatish Balay { 973827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 974827bd09bSSatish Balay if (size > SORT_OPT) 975827bd09bSSatish Balay { 976827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 977827bd09bSSatish Balay mid = size>>1; 978827bd09bSSatish Balay pi = ar+1; 979827bd09bSSatish Balay pj = ar+mid; 980827bd09bSSatish Balay pi2 = ar2+1; 981827bd09bSSatish Balay pj2 = ar2+mid; 982827bd09bSSatish Balay 983827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 984827bd09bSSatish Balay SWAP(*pi,*pj) 985827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 986827bd09bSSatish Balay 987827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 988827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 989827bd09bSSatish Balay pj = ar+size; 990827bd09bSSatish Balay pj2 = ar2+size; 991827bd09bSSatish Balay if (*pi > *pj) 992827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 993827bd09bSSatish Balay if (*ar > *pj) 994827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 995827bd09bSSatish Balay else if (*pi > *ar) 996827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 997827bd09bSSatish Balay 998827bd09bSSatish Balay /* partition about pivot_value ... */ 999827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1000827bd09bSSatish Balay for(;;) 1001827bd09bSSatish Balay { 1002827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1003827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1004827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1005827bd09bSSatish Balay 1006827bd09bSSatish Balay /* if we've crossed we're done */ 1007827bd09bSSatish Balay if (pj<pi) break; 1008827bd09bSSatish Balay 1009827bd09bSSatish Balay /* else swap */ 1010827bd09bSSatish Balay SWAP(*pi,*pj) 1011827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1012827bd09bSSatish Balay } 1013827bd09bSSatish Balay 1014827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1015827bd09bSSatish Balay SWAP(*ar,*pj) 1016827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1017827bd09bSSatish Balay 1018827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1019827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1020827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1021827bd09bSSatish Balay 1022827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1023827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1024827bd09bSSatish Balay { 1025827bd09bSSatish Balay *(top_a++) = pi; 1026827bd09bSSatish Balay *(top_a++) = (int*) pi2; 1027827bd09bSSatish Balay size -= *top_s+2; 1028827bd09bSSatish Balay top_s++; 1029827bd09bSSatish Balay } 1030827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1031827bd09bSSatish Balay else if (size -= *top_s+2) 1032827bd09bSSatish Balay {;} 1033827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1034827bd09bSSatish Balay else 1035827bd09bSSatish Balay { 1036827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1037827bd09bSSatish Balay ar = *(--top_a); 1038827bd09bSSatish Balay size = *(--top_s); 1039827bd09bSSatish Balay } 1040827bd09bSSatish Balay } 1041827bd09bSSatish Balay 1042827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1043827bd09bSSatish Balay else 1044827bd09bSSatish Balay { 1045827bd09bSSatish Balay /* insertion sort for bottom */ 1046827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1047827bd09bSSatish Balay { 1048827bd09bSSatish Balay temp = *pj; 1049827bd09bSSatish Balay ptr = *pj2; 1050827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1051827bd09bSSatish Balay { 1052827bd09bSSatish Balay if (*pi <= temp) break; 1053827bd09bSSatish Balay *(pi+1)=*pi; 1054827bd09bSSatish Balay *(pi2+1)=*pi2; 1055827bd09bSSatish Balay } 1056827bd09bSSatish Balay *(pi+1)=temp; 1057827bd09bSSatish Balay *(pi2+1)=ptr; 1058827bd09bSSatish Balay } 1059827bd09bSSatish Balay 1060827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1061827bd09bSSatish Balay if (top_s==bottom_s) return; 1062827bd09bSSatish Balay 1063827bd09bSSatish Balay /* else pop another list from the stack */ 1064827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1065827bd09bSSatish Balay ar = *(--top_a); 1066827bd09bSSatish Balay size = *(--top_s); 1067827bd09bSSatish Balay } 1068827bd09bSSatish Balay } 1069827bd09bSSatish Balay } 1070827bd09bSSatish Balay 1071827bd09bSSatish Balay 1072827bd09bSSatish Balay 1073827bd09bSSatish Balay /****************************************************************************** 1074827bd09bSSatish Balay Function: SMI_sort(). 1075827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1076827bd09bSSatish Balay Output: sorted list (in ascending order). 1077827bd09bSSatish Balay Return: none. 1078827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1079827bd09bSSatish Balay ******************************************************************************/ 1080827bd09bSSatish Balay void 1081827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type) 1082827bd09bSSatish Balay { 1083827bd09bSSatish Balay if (type == SORT_INTEGER) 1084827bd09bSSatish Balay { 1085827bd09bSSatish Balay if (ar2) 1086827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 1087827bd09bSSatish Balay else 1088827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1089827bd09bSSatish Balay } 1090827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1091827bd09bSSatish Balay { 1092827bd09bSSatish Balay if (ar2) 1093827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 1094827bd09bSSatish Balay else 1095827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1096827bd09bSSatish Balay } 1097827bd09bSSatish Balay 1098827bd09bSSatish Balay else 1099827bd09bSSatish Balay { 1100827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1101827bd09bSSatish Balay } 1102827bd09bSSatish Balay /* 1103827bd09bSSatish Balay if (type == SORT_REAL) 1104827bd09bSSatish Balay { 1105827bd09bSSatish Balay if (ar2) 1106827bd09bSSatish Balay {rvec_sort_companion(ar2,ar1,size);} 1107827bd09bSSatish Balay else 1108827bd09bSSatish Balay {rvec_sort(ar1,size);} 1109827bd09bSSatish Balay } 1110827bd09bSSatish Balay */ 1111827bd09bSSatish Balay } 1112827bd09bSSatish Balay 1113827bd09bSSatish Balay 1114827bd09bSSatish Balay 1115827bd09bSSatish Balay /**********************************ivec.c************************************** 1116827bd09bSSatish Balay Function ivec_linear_search() 1117827bd09bSSatish Balay 1118827bd09bSSatish Balay Input : 1119827bd09bSSatish Balay Output: 1120827bd09bSSatish Balay Return: 1121827bd09bSSatish Balay Description: 1122827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1123827bd09bSSatish Balay int 1124a501084fSBarry Smith ivec_linear_search( int item, int *list, int n) 1125827bd09bSSatish Balay { 1126a501084fSBarry Smith int tmp = n-1; 1127827bd09bSSatish Balay 1128827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1129827bd09bSSatish Balay return(-1); 1130827bd09bSSatish Balay } 1131827bd09bSSatish Balay 1132827bd09bSSatish Balay 1133827bd09bSSatish Balay 1134827bd09bSSatish Balay /**********************************ivec.c************************************** 1135827bd09bSSatish Balay Function ivec_binary_search() 1136827bd09bSSatish Balay 1137827bd09bSSatish Balay Input : 1138827bd09bSSatish Balay Output: 1139827bd09bSSatish Balay Return: 1140827bd09bSSatish Balay Description: 1141827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1142827bd09bSSatish Balay int 1143a501084fSBarry Smith ivec_binary_search( int item, int *list, int rh) 1144827bd09bSSatish Balay { 1145a501084fSBarry Smith int mid, lh=0; 1146827bd09bSSatish Balay 1147827bd09bSSatish Balay rh--; 1148827bd09bSSatish Balay while (lh<=rh) 1149827bd09bSSatish Balay { 1150827bd09bSSatish Balay mid = (lh+rh)>>1; 1151827bd09bSSatish Balay if (*(list+mid) == item) 1152827bd09bSSatish Balay {return(mid);} 1153827bd09bSSatish Balay if (*(list+mid) > item) 1154827bd09bSSatish Balay {rh = mid-1;} 1155827bd09bSSatish Balay else 1156827bd09bSSatish Balay {lh = mid+1;} 1157827bd09bSSatish Balay } 1158827bd09bSSatish Balay return(-1); 1159827bd09bSSatish Balay } 1160827bd09bSSatish Balay 1161827bd09bSSatish Balay 1162827bd09bSSatish Balay 1163827bd09bSSatish Balay /**********************************ivec.c************************************** 1164827bd09bSSatish Balay Function rvec_dump 1165827bd09bSSatish Balay 1166827bd09bSSatish Balay Input : 1167827bd09bSSatish Balay Output: 1168827bd09bSSatish Balay Return: 1169827bd09bSSatish Balay Description: 1170827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1171827bd09bSSatish Balay void 1172a501084fSBarry Smith rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s) 1173827bd09bSSatish Balay { 1174827bd09bSSatish Balay int i; 1175827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1176827bd09bSSatish Balay for (i=0;i<n;i++) 1177827bd09bSSatish Balay {printf("%f ",v[i]);} 1178827bd09bSSatish Balay printf("\n"); 1179827bd09bSSatish Balay fflush(stdout); 1180827bd09bSSatish Balay } 1181827bd09bSSatish Balay 1182827bd09bSSatish Balay 1183827bd09bSSatish Balay 1184827bd09bSSatish Balay /**********************************ivec.c************************************** 1185827bd09bSSatish Balay Function rvec_lb_ub() 1186827bd09bSSatish Balay 1187827bd09bSSatish Balay Input : 1188827bd09bSSatish Balay Output: 1189827bd09bSSatish Balay Return: 1190827bd09bSSatish Balay Description: 1191827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1192827bd09bSSatish Balay void 1193a501084fSBarry Smith rvec_lb_ub( PetscScalar *arg1, int n, PetscScalar *lb, PetscScalar *ub) 1194827bd09bSSatish Balay { 1195a501084fSBarry Smith PetscScalar min = REAL_MAX; 1196a501084fSBarry Smith PetscScalar max = -REAL_MAX; 1197827bd09bSSatish Balay 1198827bd09bSSatish Balay while (n--) 1199827bd09bSSatish Balay { 120039945688SSatish Balay min = PetscMin(min,*arg1); 120139945688SSatish Balay max = PetscMax(max,*arg1); 1202827bd09bSSatish Balay arg1++; 1203827bd09bSSatish Balay } 1204827bd09bSSatish Balay 1205827bd09bSSatish Balay *lb=min; 1206827bd09bSSatish Balay *ub=max; 1207827bd09bSSatish Balay } 1208827bd09bSSatish Balay 1209827bd09bSSatish Balay 1210827bd09bSSatish Balay 1211827bd09bSSatish Balay /********************************ivec.c************************************** 1212827bd09bSSatish Balay Function rvec_copy() 1213827bd09bSSatish Balay 1214827bd09bSSatish Balay Input : 1215827bd09bSSatish Balay Output: 1216827bd09bSSatish Balay Return: 1217827bd09bSSatish Balay Description: 1218827bd09bSSatish Balay *********************************ivec.c*************************************/ 1219827bd09bSSatish Balay void 1220a501084fSBarry Smith rvec_copy( PetscScalar *arg1, PetscScalar *arg2, int n) 1221827bd09bSSatish Balay { 1222827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 1223827bd09bSSatish Balay } 1224827bd09bSSatish Balay 1225827bd09bSSatish Balay 1226827bd09bSSatish Balay 1227827bd09bSSatish Balay /********************************ivec.c************************************** 1228827bd09bSSatish Balay Function rvec_zero() 1229827bd09bSSatish Balay 1230827bd09bSSatish Balay Input : 1231827bd09bSSatish Balay Output: 1232827bd09bSSatish Balay Return: 1233827bd09bSSatish Balay Description: 1234827bd09bSSatish Balay *********************************ivec.c*************************************/ 1235827bd09bSSatish Balay void 1236a501084fSBarry Smith rvec_zero( PetscScalar *arg1, int n) 1237827bd09bSSatish Balay { 1238827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 1239827bd09bSSatish Balay } 1240827bd09bSSatish Balay 1241827bd09bSSatish Balay 1242827bd09bSSatish Balay 1243827bd09bSSatish Balay /**********************************ivec.c************************************** 1244827bd09bSSatish Balay Function rvec_one() 1245827bd09bSSatish Balay 1246827bd09bSSatish Balay Input : 1247827bd09bSSatish Balay Output: 1248827bd09bSSatish Balay Return: 1249827bd09bSSatish Balay Description: 1250827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1251827bd09bSSatish Balay void 1252a501084fSBarry Smith rvec_one( PetscScalar *arg1, int n) 1253827bd09bSSatish Balay { 1254827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 1255827bd09bSSatish Balay } 1256827bd09bSSatish Balay 1257827bd09bSSatish Balay 1258827bd09bSSatish Balay 1259827bd09bSSatish Balay /**********************************ivec.c************************************** 1260827bd09bSSatish Balay Function rvec_neg_one() 1261827bd09bSSatish Balay 1262827bd09bSSatish Balay Input : 1263827bd09bSSatish Balay Output: 1264827bd09bSSatish Balay Return: 1265827bd09bSSatish Balay Description: 1266827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1267827bd09bSSatish Balay void 1268a501084fSBarry Smith rvec_neg_one( PetscScalar *arg1, int n) 1269827bd09bSSatish Balay { 1270827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 1271827bd09bSSatish Balay } 1272827bd09bSSatish Balay 1273827bd09bSSatish Balay 1274827bd09bSSatish Balay 1275827bd09bSSatish Balay /**********************************ivec.c************************************** 1276827bd09bSSatish Balay Function rvec_set() 1277827bd09bSSatish Balay 1278827bd09bSSatish Balay Input : 1279827bd09bSSatish Balay Output: 1280827bd09bSSatish Balay Return: 1281827bd09bSSatish Balay Description: 1282827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1283827bd09bSSatish Balay void 1284a501084fSBarry Smith rvec_set( PetscScalar *arg1, PetscScalar arg2, int n) 1285827bd09bSSatish Balay { 1286827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 1287827bd09bSSatish Balay } 1288827bd09bSSatish Balay 1289827bd09bSSatish Balay 1290827bd09bSSatish Balay 1291827bd09bSSatish Balay /**********************************ivec.c************************************** 1292827bd09bSSatish Balay Function rvec_scale() 1293827bd09bSSatish Balay 1294827bd09bSSatish Balay Input : 1295827bd09bSSatish Balay Output: 1296827bd09bSSatish Balay Return: 1297827bd09bSSatish Balay Description: 1298827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1299827bd09bSSatish Balay void 1300a501084fSBarry Smith rvec_scale( PetscScalar *arg1, PetscScalar arg2, int n) 1301827bd09bSSatish Balay { 1302827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 1303827bd09bSSatish Balay } 1304827bd09bSSatish Balay 1305827bd09bSSatish Balay 1306827bd09bSSatish Balay 1307827bd09bSSatish Balay /********************************ivec.c************************************** 1308827bd09bSSatish Balay Function rvec_add() 1309827bd09bSSatish Balay 1310827bd09bSSatish Balay Input : 1311827bd09bSSatish Balay Output: 1312827bd09bSSatish Balay Return: 1313827bd09bSSatish Balay Description: 1314827bd09bSSatish Balay *********************************ivec.c*************************************/ 1315827bd09bSSatish Balay void 1316a501084fSBarry Smith rvec_add( PetscScalar *arg1, PetscScalar *arg2, int n) 1317827bd09bSSatish Balay { 1318827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1319827bd09bSSatish Balay } 1320827bd09bSSatish Balay 1321827bd09bSSatish Balay 1322827bd09bSSatish Balay 1323827bd09bSSatish Balay /********************************ivec.c************************************** 1324827bd09bSSatish Balay Function rvec_dot() 1325827bd09bSSatish Balay 1326827bd09bSSatish Balay Input : 1327827bd09bSSatish Balay Output: 1328827bd09bSSatish Balay Return: 1329827bd09bSSatish Balay Description: 1330827bd09bSSatish Balay *********************************ivec.c*************************************/ 1331a501084fSBarry Smith PetscScalar 1332a501084fSBarry Smith rvec_dot( PetscScalar *arg1, PetscScalar *arg2, int n) 1333827bd09bSSatish Balay { 1334a501084fSBarry Smith PetscScalar dot=0.0; 1335827bd09bSSatish Balay 1336827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1337827bd09bSSatish Balay 1338827bd09bSSatish Balay return(dot); 1339827bd09bSSatish Balay } 1340827bd09bSSatish Balay 1341827bd09bSSatish Balay 1342827bd09bSSatish Balay 1343827bd09bSSatish Balay /********************************ivec.c************************************** 1344827bd09bSSatish Balay Function rvec_axpy() 1345827bd09bSSatish Balay 1346827bd09bSSatish Balay Input : 1347827bd09bSSatish Balay Output: 1348827bd09bSSatish Balay Return: 1349827bd09bSSatish Balay Description: 1350827bd09bSSatish Balay *********************************ivec.c*************************************/ 1351827bd09bSSatish Balay void 1352a501084fSBarry Smith rvec_axpy( PetscScalar *arg1, PetscScalar *arg2, PetscScalar scale, 1353a501084fSBarry Smith int n) 1354827bd09bSSatish Balay { 1355827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 1356827bd09bSSatish Balay } 1357827bd09bSSatish Balay 1358827bd09bSSatish Balay 1359827bd09bSSatish Balay /********************************ivec.c************************************** 1360827bd09bSSatish Balay Function rvec_mult() 1361827bd09bSSatish Balay 1362827bd09bSSatish Balay Input : 1363827bd09bSSatish Balay Output: 1364827bd09bSSatish Balay Return: 1365827bd09bSSatish Balay Description: 1366827bd09bSSatish Balay *********************************ivec.c*************************************/ 1367827bd09bSSatish Balay void 1368a501084fSBarry Smith rvec_mult( PetscScalar *arg1, PetscScalar *arg2, int n) 1369827bd09bSSatish Balay { 1370827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1371827bd09bSSatish Balay } 1372827bd09bSSatish Balay 1373827bd09bSSatish Balay 1374827bd09bSSatish Balay 1375827bd09bSSatish Balay /********************************ivec.c************************************** 1376827bd09bSSatish Balay Function rvec_max() 1377827bd09bSSatish Balay 1378827bd09bSSatish Balay Input : 1379827bd09bSSatish Balay Output: 1380827bd09bSSatish Balay Return: 1381827bd09bSSatish Balay Description: 1382827bd09bSSatish Balay *********************************ivec.c*************************************/ 1383827bd09bSSatish Balay void 1384a501084fSBarry Smith rvec_max( PetscScalar *arg1, PetscScalar *arg2, int n) 1385827bd09bSSatish Balay { 138639945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 1387827bd09bSSatish Balay } 1388827bd09bSSatish Balay 1389827bd09bSSatish Balay 1390827bd09bSSatish Balay 1391827bd09bSSatish Balay /********************************ivec.c************************************** 1392827bd09bSSatish Balay Function rvec_max_abs() 1393827bd09bSSatish Balay 1394827bd09bSSatish Balay Input : 1395827bd09bSSatish Balay Output: 1396827bd09bSSatish Balay Return: 1397827bd09bSSatish Balay Description: 1398827bd09bSSatish Balay *********************************ivec.c*************************************/ 1399827bd09bSSatish Balay void 1400a501084fSBarry Smith rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1401827bd09bSSatish Balay { 1402827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 1403827bd09bSSatish Balay } 1404827bd09bSSatish Balay 1405827bd09bSSatish Balay 1406827bd09bSSatish Balay 1407827bd09bSSatish Balay /********************************ivec.c************************************** 1408827bd09bSSatish Balay Function rvec_min() 1409827bd09bSSatish Balay 1410827bd09bSSatish Balay Input : 1411827bd09bSSatish Balay Output: 1412827bd09bSSatish Balay Return: 1413827bd09bSSatish Balay Description: 1414827bd09bSSatish Balay *********************************ivec.c*************************************/ 1415827bd09bSSatish Balay void 1416a501084fSBarry Smith rvec_min( PetscScalar *arg1, PetscScalar *arg2, int n) 1417827bd09bSSatish Balay { 141839945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 1419827bd09bSSatish Balay } 1420827bd09bSSatish Balay 1421827bd09bSSatish Balay 1422827bd09bSSatish Balay 1423827bd09bSSatish Balay /********************************ivec.c************************************** 1424827bd09bSSatish Balay Function rvec_min_abs() 1425827bd09bSSatish Balay 1426827bd09bSSatish Balay Input : 1427827bd09bSSatish Balay Output: 1428827bd09bSSatish Balay Return: 1429827bd09bSSatish Balay Description: 1430827bd09bSSatish Balay *********************************ivec.c*************************************/ 1431827bd09bSSatish Balay void 1432a501084fSBarry Smith rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1433827bd09bSSatish Balay { 1434827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 1435827bd09bSSatish Balay } 1436827bd09bSSatish Balay 1437827bd09bSSatish Balay 1438827bd09bSSatish Balay 1439827bd09bSSatish Balay /********************************ivec.c************************************** 1440827bd09bSSatish Balay Function rvec_exists() 1441827bd09bSSatish Balay 1442827bd09bSSatish Balay Input : 1443827bd09bSSatish Balay Output: 1444827bd09bSSatish Balay Return: 1445827bd09bSSatish Balay Description: 1446827bd09bSSatish Balay *********************************ivec.c*************************************/ 1447827bd09bSSatish Balay void 1448a501084fSBarry Smith rvec_exists( PetscScalar *arg1, PetscScalar *arg2, int n) 1449827bd09bSSatish Balay { 1450827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 1451827bd09bSSatish Balay } 1452827bd09bSSatish Balay 1453827bd09bSSatish Balay 1454827bd09bSSatish Balay 1455827bd09bSSatish Balay /**********************************ivec.c************************************** 1456827bd09bSSatish Balay Function rvec_non_uniform() 1457827bd09bSSatish Balay 1458827bd09bSSatish Balay Input : 1459827bd09bSSatish Balay Output: 1460827bd09bSSatish Balay Return: 1461827bd09bSSatish Balay Description: 1462827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1463827bd09bSSatish Balay void 1464a501084fSBarry Smith rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, int n, int *arg3) 1465827bd09bSSatish Balay { 1466a501084fSBarry Smith int i, j, type; 1467827bd09bSSatish Balay 1468827bd09bSSatish Balay 1469827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1470827bd09bSSatish Balay for (i=0;i<n;) 1471827bd09bSSatish Balay { 1472827bd09bSSatish Balay /* clump 'em for now */ 1473827bd09bSSatish Balay j=i+1; 1474827bd09bSSatish Balay type = arg3[i]; 1475827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1476827bd09bSSatish Balay {j++;} 1477827bd09bSSatish Balay 1478827bd09bSSatish Balay /* how many together */ 1479827bd09bSSatish Balay j -= i; 1480827bd09bSSatish Balay 1481827bd09bSSatish Balay /* call appropriate ivec function */ 1482827bd09bSSatish Balay if (type == GL_MAX) 1483827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1484827bd09bSSatish Balay else if (type == GL_MIN) 1485827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1486827bd09bSSatish Balay else if (type == GL_MULT) 1487827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1488827bd09bSSatish Balay else if (type == GL_ADD) 1489827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1490827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1491827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1492827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1493827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1494827bd09bSSatish Balay else if (type == GL_EXISTS) 1495827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1496827bd09bSSatish Balay else 1497827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1498827bd09bSSatish Balay 1499827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1500827bd09bSSatish Balay } 1501827bd09bSSatish Balay } 1502827bd09bSSatish Balay 1503827bd09bSSatish Balay 1504827bd09bSSatish Balay 1505827bd09bSSatish Balay /**********************************ivec.c************************************** 1506827bd09bSSatish Balay Function rvec_fct_addr() 1507827bd09bSSatish Balay 1508827bd09bSSatish Balay Input : 1509827bd09bSSatish Balay Output: 1510827bd09bSSatish Balay Return: 1511827bd09bSSatish Balay Description: 1512827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1513a501084fSBarry Smith vfp rvec_fct_addr( int type) 1514827bd09bSSatish Balay { 1515827bd09bSSatish Balay if (type == NON_UNIFORM) 1516827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_non_uniform);} 1517827bd09bSSatish Balay else if (type == GL_MAX) 1518827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max);} 1519827bd09bSSatish Balay else if (type == GL_MIN) 1520827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min);} 1521827bd09bSSatish Balay else if (type == GL_MULT) 1522827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_mult);} 1523827bd09bSSatish Balay else if (type == GL_ADD) 1524827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_add);} 1525827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1526827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_max_abs);} 1527827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1528827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_min_abs);} 1529827bd09bSSatish Balay else if (type == GL_EXISTS) 1530827bd09bSSatish Balay {return((void (*)(void*, void *, int, ...))&rvec_exists);} 1531827bd09bSSatish Balay 1532827bd09bSSatish Balay /* catch all ... not good if we get here */ 1533827bd09bSSatish Balay return(NULL); 1534827bd09bSSatish Balay } 1535827bd09bSSatish Balay 1536827bd09bSSatish Balay 1537827bd09bSSatish Balay /****************************************************************************** 1538827bd09bSSatish Balay Function: my_sort(). 1539827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1540827bd09bSSatish Balay Output: sorted list (in ascending order). 1541827bd09bSSatish Balay Return: none. 1542827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1543827bd09bSSatish Balay ******************************************************************************/ 1544827bd09bSSatish Balay void 1545a501084fSBarry Smith rvec_sort( PetscScalar *ar, int Size) 1546827bd09bSSatish Balay { 1547a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1548a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1549a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1550a501084fSBarry Smith long size = (long) Size; 1551827bd09bSSatish Balay 1552827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1553827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1554827bd09bSSatish Balay size--; 1555827bd09bSSatish Balay 1556827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1557827bd09bSSatish Balay for (;;) 1558827bd09bSSatish Balay { 1559827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1560827bd09bSSatish Balay if (size > SORT_OPT) 1561827bd09bSSatish Balay { 1562827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1563827bd09bSSatish Balay pi = ar+1; 1564827bd09bSSatish Balay pj = ar+size; 1565827bd09bSSatish Balay 1566827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1567827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1568827bd09bSSatish Balay 1569827bd09bSSatish Balay pj = ar+size; 1570827bd09bSSatish Balay 1571827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1572827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1573827bd09bSSatish Balay if (*pi > *pj) 1574827bd09bSSatish Balay {SWAP(*pi,*pj)} 1575827bd09bSSatish Balay if (*ar > *pj) 1576827bd09bSSatish Balay {SWAP(*ar,*pj)} 1577827bd09bSSatish Balay else if (*pi > *ar) 1578827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1579827bd09bSSatish Balay 1580827bd09bSSatish Balay /* partition about pivot_value ... */ 1581827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1582827bd09bSSatish Balay for(;;) 1583827bd09bSSatish Balay { 1584827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1585827bd09bSSatish Balay do pi++; while (*pi<*ar); 1586827bd09bSSatish Balay do pj--; while (*pj>*ar); 1587827bd09bSSatish Balay 1588827bd09bSSatish Balay /* if we've crossed we're done */ 1589827bd09bSSatish Balay if (pj<pi) break; 1590827bd09bSSatish Balay 1591827bd09bSSatish Balay /* else swap */ 1592827bd09bSSatish Balay SWAP(*pi,*pj) 1593827bd09bSSatish Balay } 1594827bd09bSSatish Balay 1595827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1596827bd09bSSatish Balay SWAP(*ar,*pj) 1597827bd09bSSatish Balay 1598827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1599827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1600827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1601827bd09bSSatish Balay 1602827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1603827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1604827bd09bSSatish Balay { 1605827bd09bSSatish Balay *(top_a++) = pi; 1606827bd09bSSatish Balay size -= *top_s+2; 1607827bd09bSSatish Balay top_s++; 1608827bd09bSSatish Balay } 1609827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1610827bd09bSSatish Balay else if (size -= *top_s+2) 1611827bd09bSSatish Balay {;} 1612827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1613827bd09bSSatish Balay else 1614827bd09bSSatish Balay { 1615827bd09bSSatish Balay ar = *(--top_a); 1616827bd09bSSatish Balay size = *(--top_s); 1617827bd09bSSatish Balay } 1618827bd09bSSatish Balay } 1619827bd09bSSatish Balay 1620827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1621827bd09bSSatish Balay else 1622827bd09bSSatish Balay { 1623827bd09bSSatish Balay /* insertion sort for bottom */ 1624827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1625827bd09bSSatish Balay { 1626827bd09bSSatish Balay temp = *pj; 1627827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1628827bd09bSSatish Balay { 1629827bd09bSSatish Balay if (*pi <= temp) break; 1630827bd09bSSatish Balay *(pi+1)=*pi; 1631827bd09bSSatish Balay } 1632827bd09bSSatish Balay *(pi+1)=temp; 1633827bd09bSSatish Balay } 1634827bd09bSSatish Balay 1635827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1636827bd09bSSatish Balay if (top_s==bottom_s) return; 1637827bd09bSSatish Balay 1638827bd09bSSatish Balay /* else pop another list from the stack */ 1639827bd09bSSatish Balay ar = *(--top_a); 1640827bd09bSSatish Balay size = *(--top_s); 1641827bd09bSSatish Balay } 1642827bd09bSSatish Balay } 1643827bd09bSSatish Balay } 1644827bd09bSSatish Balay 1645827bd09bSSatish Balay 1646827bd09bSSatish Balay 1647827bd09bSSatish Balay /****************************************************************************** 1648827bd09bSSatish Balay Function: my_sort(). 1649827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1650827bd09bSSatish Balay Output: sorted list (in ascending order). 1651827bd09bSSatish Balay Return: none. 1652827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1653827bd09bSSatish Balay ******************************************************************************/ 1654827bd09bSSatish Balay void 1655a501084fSBarry Smith rvec_sort_companion( PetscScalar *ar, int *ar2, int Size) 1656827bd09bSSatish Balay { 1657a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1658a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1659a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1660a501084fSBarry Smith long size = (long) Size; 1661827bd09bSSatish Balay 1662a501084fSBarry Smith int *pi2, *pj2; 1663a501084fSBarry Smith int ptr; 1664a501084fSBarry Smith long mid; 1665827bd09bSSatish Balay 1666827bd09bSSatish Balay 1667827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1668827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1669827bd09bSSatish Balay size--; 1670827bd09bSSatish Balay 1671827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1672827bd09bSSatish Balay for (;;) 1673827bd09bSSatish Balay { 1674827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1675827bd09bSSatish Balay if (size > SORT_OPT) 1676827bd09bSSatish Balay { 1677827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1678827bd09bSSatish Balay mid = size>>1; 1679827bd09bSSatish Balay pi = ar+1; 1680827bd09bSSatish Balay pj = ar+mid; 1681827bd09bSSatish Balay pi2 = ar2+1; 1682827bd09bSSatish Balay pj2 = ar2+mid; 1683827bd09bSSatish Balay 1684827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1685827bd09bSSatish Balay SWAP(*pi,*pj) 1686827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1687827bd09bSSatish Balay 1688827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1689827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1690827bd09bSSatish Balay pj = ar+size; 1691827bd09bSSatish Balay pj2 = ar2+size; 1692827bd09bSSatish Balay if (*pi > *pj) 1693827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1694827bd09bSSatish Balay if (*ar > *pj) 1695827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1696827bd09bSSatish Balay else if (*pi > *ar) 1697827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1698827bd09bSSatish Balay 1699827bd09bSSatish Balay /* partition about pivot_value ... */ 1700827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1701827bd09bSSatish Balay for(;;) 1702827bd09bSSatish Balay { 1703827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1704827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1705827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1706827bd09bSSatish Balay 1707827bd09bSSatish Balay /* if we've crossed we're done */ 1708827bd09bSSatish Balay if (pj<pi) break; 1709827bd09bSSatish Balay 1710827bd09bSSatish Balay /* else swap */ 1711827bd09bSSatish Balay SWAP(*pi,*pj) 1712827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1713827bd09bSSatish Balay } 1714827bd09bSSatish Balay 1715827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1716827bd09bSSatish Balay SWAP(*ar,*pj) 1717827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1718827bd09bSSatish Balay 1719827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1720827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1721827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1722827bd09bSSatish Balay 1723827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1724827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1725827bd09bSSatish Balay { 1726827bd09bSSatish Balay *(top_a++) = pi; 1727a501084fSBarry Smith *(top_a++) = (PetscScalar *) pi2; 1728827bd09bSSatish Balay size -= *top_s+2; 1729827bd09bSSatish Balay top_s++; 1730827bd09bSSatish Balay } 1731827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1732827bd09bSSatish Balay else if (size -= *top_s+2) 1733827bd09bSSatish Balay {;} 1734827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1735827bd09bSSatish Balay else 1736827bd09bSSatish Balay { 1737827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1738827bd09bSSatish Balay ar = *(--top_a); 1739827bd09bSSatish Balay size = *(--top_s); 1740827bd09bSSatish Balay } 1741827bd09bSSatish Balay } 1742827bd09bSSatish Balay 1743827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1744827bd09bSSatish Balay else 1745827bd09bSSatish Balay { 1746827bd09bSSatish Balay /* insertion sort for bottom */ 1747827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1748827bd09bSSatish Balay { 1749827bd09bSSatish Balay temp = *pj; 1750827bd09bSSatish Balay ptr = *pj2; 1751827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1752827bd09bSSatish Balay { 1753827bd09bSSatish Balay if (*pi <= temp) break; 1754827bd09bSSatish Balay *(pi+1)=*pi; 1755827bd09bSSatish Balay *(pi2+1)=*pi2; 1756827bd09bSSatish Balay } 1757827bd09bSSatish Balay *(pi+1)=temp; 1758827bd09bSSatish Balay *(pi2+1)=ptr; 1759827bd09bSSatish Balay } 1760827bd09bSSatish Balay 1761827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1762827bd09bSSatish Balay if (top_s==bottom_s) return; 1763827bd09bSSatish Balay 1764827bd09bSSatish Balay /* else pop another list from the stack */ 1765827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1766827bd09bSSatish Balay ar = *(--top_a); 1767827bd09bSSatish Balay size = *(--top_s); 1768827bd09bSSatish Balay } 1769827bd09bSSatish Balay } 1770827bd09bSSatish Balay } 1771827bd09bSSatish Balay 1772827bd09bSSatish Balay 1773827bd09bSSatish Balay 1774827bd09bSSatish Balay 1775827bd09bSSatish Balay 1776827bd09bSSatish Balay /**********************************ivec.c************************************** 1777827bd09bSSatish Balay Function ivec_binary_search() 1778827bd09bSSatish Balay 1779827bd09bSSatish Balay Input : 1780827bd09bSSatish Balay Output: 1781827bd09bSSatish Balay Return: 1782827bd09bSSatish Balay Description: 1783827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1784827bd09bSSatish Balay int 1785a501084fSBarry Smith rvec_binary_search( PetscScalar item, PetscScalar *list, int rh) 1786827bd09bSSatish Balay { 1787a501084fSBarry Smith int mid, lh=0; 1788827bd09bSSatish Balay 1789827bd09bSSatish Balay rh--; 1790827bd09bSSatish Balay while (lh<=rh) 1791827bd09bSSatish Balay { 1792827bd09bSSatish Balay mid = (lh+rh)>>1; 1793827bd09bSSatish Balay if (*(list+mid) == item) 1794827bd09bSSatish Balay {return(mid);} 1795827bd09bSSatish Balay if (*(list+mid) > item) 1796827bd09bSSatish Balay {rh = mid-1;} 1797827bd09bSSatish Balay else 1798827bd09bSSatish Balay {lh = mid+1;} 1799827bd09bSSatish Balay } 1800827bd09bSSatish Balay return(-1); 1801827bd09bSSatish Balay } 1802827bd09bSSatish Balay 1803827bd09bSSatish Balay 1804827bd09bSSatish Balay 1805827bd09bSSatish Balay 1806827bd09bSSatish Balay 1807