1dba47a55SKris Buschelman #define PETSCKSP_DLL 2827bd09bSSatish Balay 3827bd09bSSatish Balay /**********************************ivec.c************************************** 4827bd09bSSatish Balay 5827bd09bSSatish Balay Author: Henry M. Tufo III 6827bd09bSSatish Balay 7827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 8827bd09bSSatish Balay 9827bd09bSSatish Balay snail-mail: 10827bd09bSSatish Balay Division of Applied Mathematics 11827bd09bSSatish Balay Brown University 12827bd09bSSatish Balay Providence, RI 02912 13827bd09bSSatish Balay 14827bd09bSSatish Balay Last Modification: 15827bd09bSSatish Balay 6.21.97 16827bd09bSSatish Balay ***********************************ivec.c*************************************/ 17827bd09bSSatish Balay 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*************************************/ 45*3fdc5746SBarry Smith PetscErrorCode 46827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s) 47827bd09bSSatish Balay { 48827bd09bSSatish Balay int i; 49*3fdc5746SBarry Smith PetscFunctionBegin; 50827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 51827bd09bSSatish Balay for (i=0;i<n;i++) 52827bd09bSSatish Balay {printf("%2d ",v[i]);} 53827bd09bSSatish Balay printf("\n"); 54827bd09bSSatish Balay fflush(stdout); 55*3fdc5746SBarry Smith PetscFunctionReturn(0); 56827bd09bSSatish Balay } 57827bd09bSSatish Balay 58827bd09bSSatish Balay 59827bd09bSSatish Balay 60827bd09bSSatish Balay /**********************************ivec.c************************************** 61827bd09bSSatish Balay Function ivec_lb_ub() 62827bd09bSSatish Balay 63827bd09bSSatish Balay Input : 64827bd09bSSatish Balay Output: 65827bd09bSSatish Balay Return: 66827bd09bSSatish Balay Description: 67827bd09bSSatish Balay ***********************************ivec.c*************************************/ 68*3fdc5746SBarry Smith PetscErrorCode 69a501084fSBarry Smith ivec_lb_ub( int *arg1, int n, int *lb, int *ub) 70827bd09bSSatish Balay { 71a501084fSBarry Smith int min = INT_MAX; 72a501084fSBarry Smith int max = INT_MIN; 73827bd09bSSatish Balay 74*3fdc5746SBarry Smith PetscFunctionBegin; 75827bd09bSSatish Balay while (n--) 76827bd09bSSatish Balay { 7739945688SSatish Balay min = PetscMin(min,*arg1); 7839945688SSatish Balay max = PetscMax(max,*arg1); 79827bd09bSSatish Balay arg1++; 80827bd09bSSatish Balay } 81827bd09bSSatish Balay 82827bd09bSSatish Balay *lb=min; 83827bd09bSSatish Balay *ub=max; 84*3fdc5746SBarry Smith PetscFunctionReturn(0); 85827bd09bSSatish Balay } 86827bd09bSSatish Balay 87827bd09bSSatish Balay 88827bd09bSSatish Balay 89827bd09bSSatish Balay /**********************************ivec.c************************************** 90827bd09bSSatish Balay Function ivec_copy() 91827bd09bSSatish Balay 92827bd09bSSatish Balay Input : 93827bd09bSSatish Balay Output: 94827bd09bSSatish Balay Return: 95827bd09bSSatish Balay Description: 96827bd09bSSatish Balay ***********************************ivec.c*************************************/ 97a501084fSBarry Smith int *ivec_copy( int *arg1, int *arg2, int n) 98827bd09bSSatish Balay { 99827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 100827bd09bSSatish Balay return(arg1); 101827bd09bSSatish Balay } 102827bd09bSSatish Balay 103827bd09bSSatish Balay 104827bd09bSSatish Balay 105827bd09bSSatish Balay /**********************************ivec.c************************************** 106827bd09bSSatish Balay Function ivec_zero() 107827bd09bSSatish Balay 108827bd09bSSatish Balay Input : 109827bd09bSSatish Balay Output: 110827bd09bSSatish Balay Return: 111827bd09bSSatish Balay Description: 112827bd09bSSatish Balay ***********************************ivec.c*************************************/ 113*3fdc5746SBarry Smith PetscErrorCode 114a501084fSBarry Smith ivec_zero( int *arg1, int n) 115827bd09bSSatish Balay { 116*3fdc5746SBarry Smith PetscFunctionBegin; 117827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 118*3fdc5746SBarry Smith PetscFunctionReturn(0); 119827bd09bSSatish Balay } 120827bd09bSSatish Balay 121827bd09bSSatish Balay 122827bd09bSSatish Balay 123827bd09bSSatish Balay /**********************************ivec.c************************************** 124827bd09bSSatish Balay Function ivec_comp() 125827bd09bSSatish Balay 126827bd09bSSatish Balay Input : 127827bd09bSSatish Balay Output: 128827bd09bSSatish Balay Return: 129827bd09bSSatish Balay Description: 130827bd09bSSatish Balay ***********************************ivec.c*************************************/ 131*3fdc5746SBarry Smith PetscErrorCode 132a501084fSBarry Smith ivec_comp( int *arg1, int n) 133827bd09bSSatish Balay { 134*3fdc5746SBarry Smith PetscFunctionBegin; 135827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 136*3fdc5746SBarry Smith PetscFunctionReturn(0); 137827bd09bSSatish Balay } 138827bd09bSSatish Balay 139827bd09bSSatish Balay 140827bd09bSSatish Balay 141827bd09bSSatish Balay /**********************************ivec.c************************************** 142827bd09bSSatish Balay Function ivec_neg_one() 143827bd09bSSatish Balay 144827bd09bSSatish Balay Input : 145827bd09bSSatish Balay Output: 146827bd09bSSatish Balay Return: 147827bd09bSSatish Balay Description: 148827bd09bSSatish Balay ***********************************ivec.c*************************************/ 149*3fdc5746SBarry Smith PetscErrorCode 150a501084fSBarry Smith ivec_neg_one( int *arg1, int n) 151827bd09bSSatish Balay { 152*3fdc5746SBarry Smith PetscFunctionBegin; 153827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 154*3fdc5746SBarry Smith PetscFunctionReturn(0); 155827bd09bSSatish Balay } 156827bd09bSSatish Balay 157827bd09bSSatish Balay 158827bd09bSSatish Balay 159827bd09bSSatish Balay /**********************************ivec.c************************************** 160827bd09bSSatish Balay Function ivec_pos_one() 161827bd09bSSatish Balay 162827bd09bSSatish Balay Input : 163827bd09bSSatish Balay Output: 164827bd09bSSatish Balay Return: 165827bd09bSSatish Balay Description: 166827bd09bSSatish Balay ***********************************ivec.c*************************************/ 167*3fdc5746SBarry Smith PetscErrorCode 168a501084fSBarry Smith ivec_pos_one( int *arg1, int n) 169827bd09bSSatish Balay { 170*3fdc5746SBarry Smith PetscFunctionBegin; 171827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 172*3fdc5746SBarry Smith PetscFunctionReturn(0); 173827bd09bSSatish Balay } 174827bd09bSSatish Balay 175827bd09bSSatish Balay 176827bd09bSSatish Balay 177827bd09bSSatish Balay /**********************************ivec.c************************************** 178827bd09bSSatish Balay Function ivec_c_index() 179827bd09bSSatish Balay 180827bd09bSSatish Balay Input : 181827bd09bSSatish Balay Output: 182827bd09bSSatish Balay Return: 183827bd09bSSatish Balay Description: 184827bd09bSSatish Balay ***********************************ivec.c*************************************/ 185*3fdc5746SBarry Smith PetscErrorCode 186a501084fSBarry Smith ivec_c_index( int *arg1, int n) 187827bd09bSSatish Balay { 188a501084fSBarry Smith int i=0; 189827bd09bSSatish Balay 190*3fdc5746SBarry Smith PetscFunctionBegin; 191827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 192*3fdc5746SBarry Smith PetscFunctionReturn(0); 193827bd09bSSatish Balay } 194827bd09bSSatish Balay 195827bd09bSSatish Balay 196827bd09bSSatish Balay 197827bd09bSSatish Balay /**********************************ivec.c************************************** 198827bd09bSSatish Balay Function ivec_fortran_index() 199827bd09bSSatish Balay 200827bd09bSSatish Balay Input : 201827bd09bSSatish Balay Output: 202827bd09bSSatish Balay Return: 203827bd09bSSatish Balay Description: 204827bd09bSSatish Balay ***********************************ivec.c*************************************/ 205*3fdc5746SBarry Smith PetscErrorCode 206a501084fSBarry Smith ivec_fortran_index( int *arg1, int n) 207827bd09bSSatish Balay { 208a501084fSBarry Smith int i=0; 209827bd09bSSatish Balay 210*3fdc5746SBarry Smith PetscFunctionBegin; 211827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 212*3fdc5746SBarry Smith PetscFunctionReturn(0); 213827bd09bSSatish Balay } 214827bd09bSSatish Balay 215827bd09bSSatish Balay 216827bd09bSSatish Balay 217827bd09bSSatish Balay /**********************************ivec.c************************************** 218827bd09bSSatish Balay Function ivec_set() 219827bd09bSSatish Balay 220827bd09bSSatish Balay Input : 221827bd09bSSatish Balay Output: 222827bd09bSSatish Balay Return: 223827bd09bSSatish Balay Description: 224827bd09bSSatish Balay ***********************************ivec.c*************************************/ 225*3fdc5746SBarry Smith PetscErrorCode 226a501084fSBarry Smith ivec_set( int *arg1, int arg2, int n) 227827bd09bSSatish Balay { 228*3fdc5746SBarry Smith PetscFunctionBegin; 229827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 230*3fdc5746SBarry Smith PetscFunctionReturn(0); 231827bd09bSSatish Balay } 232827bd09bSSatish Balay 233827bd09bSSatish Balay 234827bd09bSSatish Balay 235827bd09bSSatish Balay /**********************************ivec.c************************************** 236827bd09bSSatish Balay Function ivec_cmp() 237827bd09bSSatish Balay 238827bd09bSSatish Balay Input : 239827bd09bSSatish Balay Output: 240827bd09bSSatish Balay Return: 241827bd09bSSatish Balay Description: 242827bd09bSSatish Balay ***********************************ivec.c*************************************/ 243827bd09bSSatish Balay int 244a501084fSBarry Smith ivec_cmp( int *arg1, int *arg2, int n) 245827bd09bSSatish Balay { 246*3fdc5746SBarry Smith PetscFunctionBegin; 247827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 248827bd09bSSatish Balay return(TRUE); 249827bd09bSSatish Balay } 250827bd09bSSatish Balay 251827bd09bSSatish Balay 252827bd09bSSatish Balay 253827bd09bSSatish Balay /**********************************ivec.c************************************** 254827bd09bSSatish Balay Function ivec_max() 255827bd09bSSatish Balay 256827bd09bSSatish Balay Input : 257827bd09bSSatish Balay Output: 258827bd09bSSatish Balay Return: 259827bd09bSSatish Balay Description: 260827bd09bSSatish Balay ***********************************ivec.c*************************************/ 261*3fdc5746SBarry Smith PetscErrorCode 262a501084fSBarry Smith ivec_max( int *arg1, int *arg2, int n) 263827bd09bSSatish Balay { 264*3fdc5746SBarry Smith PetscFunctionBegin; 26539945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 266*3fdc5746SBarry Smith PetscFunctionReturn(0); 267827bd09bSSatish Balay } 268827bd09bSSatish Balay 269827bd09bSSatish Balay 270827bd09bSSatish Balay 271827bd09bSSatish Balay /**********************************ivec.c************************************** 272827bd09bSSatish Balay Function ivec_min() 273827bd09bSSatish Balay 274827bd09bSSatish Balay Input : 275827bd09bSSatish Balay Output: 276827bd09bSSatish Balay Return: 277827bd09bSSatish Balay Description: 278827bd09bSSatish Balay ***********************************ivec.c*************************************/ 279*3fdc5746SBarry Smith PetscErrorCode 280a501084fSBarry Smith ivec_min( int *arg1, int *arg2, int n) 281827bd09bSSatish Balay { 282*3fdc5746SBarry Smith PetscFunctionBegin; 28339945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 284*3fdc5746SBarry Smith PetscFunctionReturn(0); 285827bd09bSSatish Balay } 286827bd09bSSatish Balay 287827bd09bSSatish Balay 288827bd09bSSatish Balay 289827bd09bSSatish Balay /**********************************ivec.c************************************** 290827bd09bSSatish Balay Function ivec_mult() 291827bd09bSSatish Balay 292827bd09bSSatish Balay Input : 293827bd09bSSatish Balay Output: 294827bd09bSSatish Balay Return: 295827bd09bSSatish Balay Description: 296827bd09bSSatish Balay ***********************************ivec.c*************************************/ 297*3fdc5746SBarry Smith PetscErrorCode 298a501084fSBarry Smith ivec_mult( int *arg1, int *arg2, int n) 299827bd09bSSatish Balay { 300*3fdc5746SBarry Smith PetscFunctionBegin; 301827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 302*3fdc5746SBarry Smith PetscFunctionReturn(0); 303827bd09bSSatish Balay } 304827bd09bSSatish Balay 305827bd09bSSatish Balay 306827bd09bSSatish Balay 307827bd09bSSatish Balay /**********************************ivec.c************************************** 308827bd09bSSatish Balay Function ivec_add() 309827bd09bSSatish Balay 310827bd09bSSatish Balay Input : 311827bd09bSSatish Balay Output: 312827bd09bSSatish Balay Return: 313827bd09bSSatish Balay Description: 314827bd09bSSatish Balay ***********************************ivec.c*************************************/ 315*3fdc5746SBarry Smith PetscErrorCode 316a501084fSBarry Smith ivec_add( int *arg1, int *arg2, int n) 317827bd09bSSatish Balay { 318*3fdc5746SBarry Smith PetscFunctionBegin; 319827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 320*3fdc5746SBarry Smith PetscFunctionReturn(0); 321827bd09bSSatish Balay } 322827bd09bSSatish Balay 323827bd09bSSatish Balay 324827bd09bSSatish Balay 325827bd09bSSatish Balay /**********************************ivec.c************************************** 326827bd09bSSatish Balay Function ivec_lxor() 327827bd09bSSatish Balay 328827bd09bSSatish Balay Input : 329827bd09bSSatish Balay Output: 330827bd09bSSatish Balay Return: 331827bd09bSSatish Balay Description: 332827bd09bSSatish Balay ***********************************ivec.c*************************************/ 333*3fdc5746SBarry Smith PetscErrorCode 334a501084fSBarry Smith ivec_lxor( int *arg1, int *arg2, int n) 335827bd09bSSatish Balay { 336*3fdc5746SBarry Smith PetscFunctionBegin; 337827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 338*3fdc5746SBarry Smith PetscFunctionReturn(0); 339827bd09bSSatish Balay } 340827bd09bSSatish Balay 341827bd09bSSatish Balay 342827bd09bSSatish Balay 343827bd09bSSatish Balay /**********************************ivec.c************************************** 344827bd09bSSatish Balay Function ivec_xor() 345827bd09bSSatish Balay 346827bd09bSSatish Balay Input : 347827bd09bSSatish Balay Output: 348827bd09bSSatish Balay Return: 349827bd09bSSatish Balay Description: 350827bd09bSSatish Balay ***********************************ivec.c*************************************/ 351*3fdc5746SBarry Smith PetscErrorCode 352a501084fSBarry Smith ivec_xor( int *arg1, int *arg2, int n) 353827bd09bSSatish Balay { 354*3fdc5746SBarry Smith PetscFunctionBegin; 355827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 356*3fdc5746SBarry Smith PetscFunctionReturn(0); 357827bd09bSSatish Balay } 358827bd09bSSatish Balay 359827bd09bSSatish Balay 360827bd09bSSatish Balay 361827bd09bSSatish Balay /**********************************ivec.c************************************** 362827bd09bSSatish Balay Function ivec_or() 363827bd09bSSatish Balay 364827bd09bSSatish Balay Input : 365827bd09bSSatish Balay Output: 366827bd09bSSatish Balay Return: 367827bd09bSSatish Balay Description: 368827bd09bSSatish Balay ***********************************ivec.c*************************************/ 369*3fdc5746SBarry Smith PetscErrorCode 370a501084fSBarry Smith ivec_or( int *arg1, int *arg2, int n) 371827bd09bSSatish Balay { 372*3fdc5746SBarry Smith PetscFunctionBegin; 373827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 374*3fdc5746SBarry Smith PetscFunctionReturn(0); 375827bd09bSSatish Balay } 376827bd09bSSatish Balay 377827bd09bSSatish Balay 378827bd09bSSatish Balay 379827bd09bSSatish Balay /**********************************ivec.c************************************** 380827bd09bSSatish Balay Function ivec_lor() 381827bd09bSSatish Balay 382827bd09bSSatish Balay Input : 383827bd09bSSatish Balay Output: 384827bd09bSSatish Balay Return: 385827bd09bSSatish Balay Description: 386827bd09bSSatish Balay ***********************************ivec.c*************************************/ 387*3fdc5746SBarry Smith PetscErrorCode 388a501084fSBarry Smith ivec_lor( int *arg1, int *arg2, int n) 389827bd09bSSatish Balay { 390*3fdc5746SBarry Smith PetscFunctionBegin; 391827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 392*3fdc5746SBarry Smith PetscFunctionReturn(0); 393827bd09bSSatish Balay } 394827bd09bSSatish Balay 395827bd09bSSatish Balay 396827bd09bSSatish Balay 397827bd09bSSatish Balay /**********************************ivec.c************************************** 398827bd09bSSatish Balay Function ivec_or3() 399827bd09bSSatish Balay 400827bd09bSSatish Balay Input : 401827bd09bSSatish Balay Output: 402827bd09bSSatish Balay Return: 403827bd09bSSatish Balay Description: 404827bd09bSSatish Balay ***********************************ivec.c*************************************/ 405*3fdc5746SBarry Smith PetscErrorCode 406a501084fSBarry Smith ivec_or3( int *arg1, int *arg2, int *arg3, 407a501084fSBarry Smith int n) 408827bd09bSSatish Balay { 409*3fdc5746SBarry Smith PetscFunctionBegin; 410827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 411*3fdc5746SBarry Smith PetscFunctionReturn(0); 412827bd09bSSatish Balay } 413827bd09bSSatish Balay 414827bd09bSSatish Balay 415827bd09bSSatish Balay 416827bd09bSSatish Balay /**********************************ivec.c************************************** 417827bd09bSSatish Balay Function ivec_and() 418827bd09bSSatish Balay 419827bd09bSSatish Balay Input : 420827bd09bSSatish Balay Output: 421827bd09bSSatish Balay Return: 422827bd09bSSatish Balay Description: 423827bd09bSSatish Balay ***********************************ivec.c*************************************/ 424*3fdc5746SBarry Smith PetscErrorCode 425a501084fSBarry Smith ivec_and( int *arg1, int *arg2, int n) 426827bd09bSSatish Balay { 427*3fdc5746SBarry Smith PetscFunctionBegin; 428827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 429*3fdc5746SBarry Smith PetscFunctionReturn(0); 430827bd09bSSatish Balay } 431827bd09bSSatish Balay 432827bd09bSSatish Balay 433827bd09bSSatish Balay 434827bd09bSSatish Balay /**********************************ivec.c************************************** 435827bd09bSSatish Balay Function ivec_land() 436827bd09bSSatish Balay 437827bd09bSSatish Balay Input : 438827bd09bSSatish Balay Output: 439827bd09bSSatish Balay Return: 440827bd09bSSatish Balay Description: 441827bd09bSSatish Balay ***********************************ivec.c*************************************/ 442*3fdc5746SBarry Smith PetscErrorCode 443a501084fSBarry Smith ivec_land( int *arg1, int *arg2, int n) 444827bd09bSSatish Balay { 445*3fdc5746SBarry Smith PetscFunctionBegin; 446827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 447*3fdc5746SBarry Smith PetscFunctionReturn(0); 448827bd09bSSatish Balay } 449827bd09bSSatish Balay 450827bd09bSSatish Balay 451827bd09bSSatish Balay 452827bd09bSSatish Balay /**********************************ivec.c************************************** 453827bd09bSSatish Balay Function ivec_and3() 454827bd09bSSatish Balay 455827bd09bSSatish Balay Input : 456827bd09bSSatish Balay Output: 457827bd09bSSatish Balay Return: 458827bd09bSSatish Balay Description: 459827bd09bSSatish Balay ***********************************ivec.c*************************************/ 460*3fdc5746SBarry Smith PetscErrorCode 461a501084fSBarry Smith ivec_and3( int *arg1, int *arg2, int *arg3, 462a501084fSBarry Smith int n) 463827bd09bSSatish Balay { 464*3fdc5746SBarry Smith PetscFunctionBegin; 465827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 466*3fdc5746SBarry Smith PetscFunctionReturn(0); 467827bd09bSSatish Balay } 468827bd09bSSatish Balay 469827bd09bSSatish Balay 470827bd09bSSatish Balay 471827bd09bSSatish Balay /**********************************ivec.c************************************** 472827bd09bSSatish Balay Function ivec_sum 473827bd09bSSatish Balay 474827bd09bSSatish Balay Input : 475827bd09bSSatish Balay Output: 476827bd09bSSatish Balay Return: 477827bd09bSSatish Balay Description: 478827bd09bSSatish Balay ***********************************ivec.c*************************************/ 479a501084fSBarry Smith int ivec_sum( int *arg1, int n) 480827bd09bSSatish Balay { 481a501084fSBarry Smith int tmp = 0; 482827bd09bSSatish Balay 483827bd09bSSatish Balay 484827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 485827bd09bSSatish Balay return(tmp); 486827bd09bSSatish Balay } 487827bd09bSSatish Balay 488827bd09bSSatish Balay 489827bd09bSSatish Balay 490827bd09bSSatish Balay /**********************************ivec.c************************************** 491827bd09bSSatish Balay Function ivec_reduce_and 492827bd09bSSatish Balay 493827bd09bSSatish Balay Input : 494827bd09bSSatish Balay Output: 495827bd09bSSatish Balay Return: 496827bd09bSSatish Balay Description: 497827bd09bSSatish Balay ***********************************ivec.c*************************************/ 498a501084fSBarry Smith int ivec_reduce_and( int *arg1, int n) 499827bd09bSSatish Balay { 500a501084fSBarry Smith int tmp = ALL_ONES; 501827bd09bSSatish Balay 502827bd09bSSatish Balay 503827bd09bSSatish Balay while (n--) {tmp &= *arg1++;} 504827bd09bSSatish Balay return(tmp); 505827bd09bSSatish Balay } 506827bd09bSSatish Balay 507827bd09bSSatish Balay 508827bd09bSSatish Balay 509827bd09bSSatish Balay /**********************************ivec.c************************************** 510827bd09bSSatish Balay Function ivec_reduce_or 511827bd09bSSatish Balay 512827bd09bSSatish Balay Input : 513827bd09bSSatish Balay Output: 514827bd09bSSatish Balay Return: 515827bd09bSSatish Balay Description: 516827bd09bSSatish Balay ***********************************ivec.c*************************************/ 517a501084fSBarry Smith int ivec_reduce_or( int *arg1, int n) 518827bd09bSSatish Balay { 519a501084fSBarry Smith int tmp = 0; 520827bd09bSSatish Balay 521827bd09bSSatish Balay 522827bd09bSSatish Balay while (n--) {tmp |= *arg1++;} 523827bd09bSSatish Balay return(tmp); 524827bd09bSSatish Balay } 525827bd09bSSatish Balay 526827bd09bSSatish Balay 527827bd09bSSatish Balay 528827bd09bSSatish Balay /**********************************ivec.c************************************** 529827bd09bSSatish Balay Function ivec_prod 530827bd09bSSatish Balay 531827bd09bSSatish Balay Input : 532827bd09bSSatish Balay Output: 533827bd09bSSatish Balay Return: 534827bd09bSSatish Balay Description: 535827bd09bSSatish Balay ***********************************ivec.c*************************************/ 536a501084fSBarry Smith int ivec_prod( int *arg1, int n) 537827bd09bSSatish Balay { 538a501084fSBarry Smith int tmp = 1; 539827bd09bSSatish Balay 540827bd09bSSatish Balay 541827bd09bSSatish Balay while (n--) {tmp *= *arg1++;} 542827bd09bSSatish Balay return(tmp); 543827bd09bSSatish Balay } 544827bd09bSSatish Balay 545827bd09bSSatish Balay 546827bd09bSSatish Balay 547827bd09bSSatish Balay /**********************************ivec.c************************************** 548827bd09bSSatish Balay Function ivec_u_sum 549827bd09bSSatish Balay 550827bd09bSSatish Balay Input : 551827bd09bSSatish Balay Output: 552827bd09bSSatish Balay Return: 553827bd09bSSatish Balay Description: 554827bd09bSSatish Balay ***********************************ivec.c*************************************/ 555a501084fSBarry Smith int ivec_u_sum( unsigned *arg1, int n) 556827bd09bSSatish Balay { 557a501084fSBarry Smith unsigned tmp = 0; 558827bd09bSSatish Balay 559827bd09bSSatish Balay 560827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 561827bd09bSSatish Balay return(tmp); 562827bd09bSSatish Balay } 563827bd09bSSatish Balay 564827bd09bSSatish Balay 565827bd09bSSatish Balay 566827bd09bSSatish Balay /**********************************ivec.c************************************** 567827bd09bSSatish Balay Function ivec_lb() 568827bd09bSSatish Balay 569827bd09bSSatish Balay Input : 570827bd09bSSatish Balay Output: 571827bd09bSSatish Balay Return: 572827bd09bSSatish Balay Description: 573827bd09bSSatish Balay ***********************************ivec.c*************************************/ 574827bd09bSSatish Balay int 575a501084fSBarry Smith ivec_lb( int *arg1, int n) 576827bd09bSSatish Balay { 577a501084fSBarry Smith int min = INT_MAX; 578827bd09bSSatish Balay 579827bd09bSSatish Balay 58039945688SSatish Balay while (n--) {min = PetscMin(min,*arg1); arg1++;} 581827bd09bSSatish Balay return(min); 582827bd09bSSatish Balay } 583827bd09bSSatish Balay 584827bd09bSSatish Balay 585827bd09bSSatish Balay 586827bd09bSSatish Balay /**********************************ivec.c************************************** 587827bd09bSSatish Balay Function ivec_ub() 588827bd09bSSatish Balay 589827bd09bSSatish Balay Input : 590827bd09bSSatish Balay Output: 591827bd09bSSatish Balay Return: 592827bd09bSSatish Balay Description: 593827bd09bSSatish Balay ***********************************ivec.c*************************************/ 594827bd09bSSatish Balay int 595a501084fSBarry Smith ivec_ub( int *arg1, int n) 596827bd09bSSatish Balay { 597a501084fSBarry Smith int max = INT_MIN; 598827bd09bSSatish Balay 599827bd09bSSatish Balay 60039945688SSatish Balay while (n--) {max = PetscMax(max,*arg1); arg1++;} 601827bd09bSSatish Balay return(max); 602827bd09bSSatish Balay } 603827bd09bSSatish Balay 604827bd09bSSatish Balay 605827bd09bSSatish Balay 606827bd09bSSatish Balay /**********************************ivec.c************************************** 607827bd09bSSatish Balay Function split_buf() 608827bd09bSSatish Balay 609827bd09bSSatish Balay Input : 610827bd09bSSatish Balay Output: 611827bd09bSSatish Balay Return: 612827bd09bSSatish Balay Description: 613827bd09bSSatish Balay 614827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 615827bd09bSSatish Balay ***********************************ivec.c*************************************/ 616827bd09bSSatish Balay int 617a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2, int size) 618827bd09bSSatish Balay { 619827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 620827bd09bSSatish Balay return(size); 621827bd09bSSatish Balay } 622827bd09bSSatish Balay 623827bd09bSSatish Balay 624827bd09bSSatish Balay 625827bd09bSSatish Balay /**********************************ivec.c************************************** 626827bd09bSSatish Balay Function ivec_non_uniform() 627827bd09bSSatish Balay 628827bd09bSSatish Balay Input : 629827bd09bSSatish Balay Output: 630827bd09bSSatish Balay Return: 631827bd09bSSatish Balay Description: 632827bd09bSSatish Balay ***********************************ivec.c*************************************/ 633*3fdc5746SBarry Smith PetscErrorCode 634a501084fSBarry Smith ivec_non_uniform(int *arg1, int *arg2, int n, int *arg3) 635827bd09bSSatish Balay { 636a501084fSBarry Smith int i, j, type; 637827bd09bSSatish Balay 638827bd09bSSatish Balay 639*3fdc5746SBarry Smith PetscFunctionBegin; 640827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 641827bd09bSSatish Balay for (i=0;i<n;) 642827bd09bSSatish Balay { 643827bd09bSSatish Balay /* clump 'em for now */ 644827bd09bSSatish Balay j=i+1; 645827bd09bSSatish Balay type = arg3[i]; 646827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 647827bd09bSSatish Balay {j++;} 648827bd09bSSatish Balay 649827bd09bSSatish Balay /* how many together */ 650827bd09bSSatish Balay j -= i; 651827bd09bSSatish Balay 652827bd09bSSatish Balay /* call appropriate ivec function */ 653827bd09bSSatish Balay if (type == GL_MAX) 654827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 655827bd09bSSatish Balay else if (type == GL_MIN) 656827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 657827bd09bSSatish Balay else if (type == GL_MULT) 658827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 659827bd09bSSatish Balay else if (type == GL_ADD) 660827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 661827bd09bSSatish Balay else if (type == GL_B_XOR) 662827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 663827bd09bSSatish Balay else if (type == GL_B_OR) 664827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 665827bd09bSSatish Balay else if (type == GL_B_AND) 666827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 667827bd09bSSatish Balay else if (type == GL_L_XOR) 668827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 669827bd09bSSatish Balay else if (type == GL_L_OR) 670827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 671827bd09bSSatish Balay else if (type == GL_L_AND) 672827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 673827bd09bSSatish Balay else 674827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 675827bd09bSSatish Balay 676827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 677827bd09bSSatish Balay } 678*3fdc5746SBarry Smith PetscFunctionReturn(0); 679827bd09bSSatish Balay } 680827bd09bSSatish Balay 681827bd09bSSatish Balay 682827bd09bSSatish Balay 683827bd09bSSatish Balay /**********************************ivec.c************************************** 684827bd09bSSatish Balay Function ivec_addr() 685827bd09bSSatish Balay 686827bd09bSSatish Balay Input : 687827bd09bSSatish Balay Output: 688827bd09bSSatish Balay Return: 689827bd09bSSatish Balay Description: 690827bd09bSSatish Balay ***********************************ivec.c*************************************/ 691a501084fSBarry Smith vfp ivec_fct_addr( int type) 692827bd09bSSatish Balay { 693*3fdc5746SBarry Smith PetscFunctionBegin; 694827bd09bSSatish Balay if (type == NON_UNIFORM) 695*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);} 696827bd09bSSatish Balay else if (type == GL_MAX) 697*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);} 698827bd09bSSatish Balay else if (type == GL_MIN) 699*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);} 700827bd09bSSatish Balay else if (type == GL_MULT) 701*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);} 702827bd09bSSatish Balay else if (type == GL_ADD) 703*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);} 704827bd09bSSatish Balay else if (type == GL_B_XOR) 705*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);} 706827bd09bSSatish Balay else if (type == GL_B_OR) 707*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);} 708827bd09bSSatish Balay else if (type == GL_B_AND) 709*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);} 710827bd09bSSatish Balay else if (type == GL_L_XOR) 711*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);} 712827bd09bSSatish Balay else if (type == GL_L_OR) 713*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);} 714827bd09bSSatish Balay else if (type == GL_L_AND) 715*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);} 716827bd09bSSatish Balay 717827bd09bSSatish Balay /* catch all ... not good if we get here */ 718827bd09bSSatish Balay return(NULL); 719827bd09bSSatish Balay } 720827bd09bSSatish Balay 721827bd09bSSatish Balay 722827bd09bSSatish Balay /**********************************ivec.c************************************** 723827bd09bSSatish Balay Function ct_bits() 724827bd09bSSatish Balay 725827bd09bSSatish Balay Input : 726827bd09bSSatish Balay Output: 727827bd09bSSatish Balay Return: 728827bd09bSSatish Balay Description: MUST FIX THIS!!! 729827bd09bSSatish Balay ***********************************ivec.c*************************************/ 730827bd09bSSatish Balay #if defined(notusing) 731827bd09bSSatish Balay static 732827bd09bSSatish Balay int 733a501084fSBarry Smith ivec_ct_bits( int *ptr, int n) 734827bd09bSSatish Balay { 735a501084fSBarry Smith int tmp=0; 736827bd09bSSatish Balay 737827bd09bSSatish Balay 738827bd09bSSatish Balay /* should expand to full 32 bit */ 739827bd09bSSatish Balay while (n--) 740827bd09bSSatish Balay { 741827bd09bSSatish Balay if (*ptr&128) {tmp++;} 742827bd09bSSatish Balay if (*ptr&64) {tmp++;} 743827bd09bSSatish Balay if (*ptr&32) {tmp++;} 744827bd09bSSatish Balay if (*ptr&16) {tmp++;} 745827bd09bSSatish Balay if (*ptr&8) {tmp++;} 746827bd09bSSatish Balay if (*ptr&4) {tmp++;} 747827bd09bSSatish Balay if (*ptr&2) {tmp++;} 748827bd09bSSatish Balay if (*ptr&1) {tmp++;} 749827bd09bSSatish Balay ptr++; 750827bd09bSSatish Balay } 751827bd09bSSatish Balay 752827bd09bSSatish Balay return(tmp); 753827bd09bSSatish Balay } 754827bd09bSSatish Balay #endif 755827bd09bSSatish Balay 756827bd09bSSatish Balay 757827bd09bSSatish Balay /****************************************************************************** 758827bd09bSSatish Balay Function: ivec_sort(). 759827bd09bSSatish Balay 760827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 761827bd09bSSatish Balay Output: sorted list (in ascending order). 762827bd09bSSatish Balay Return: none. 763827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 764827bd09bSSatish Balay ******************************************************************************/ 765*3fdc5746SBarry Smith PetscErrorCode 766a501084fSBarry Smith ivec_sort( int *ar, int size) 767827bd09bSSatish Balay { 768a501084fSBarry Smith int *pi, *pj, temp; 769a501084fSBarry Smith int **top_a = (int **) offset_stack; 770a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 771827bd09bSSatish Balay 772827bd09bSSatish Balay 773827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 774827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 775827bd09bSSatish Balay size--; 776827bd09bSSatish Balay 777827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 778827bd09bSSatish Balay for (;;) 779827bd09bSSatish Balay { 780827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 781827bd09bSSatish Balay if (size > SORT_OPT) 782827bd09bSSatish Balay { 783827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 784827bd09bSSatish Balay pi = ar+1; 785827bd09bSSatish Balay pj = ar+size; 786827bd09bSSatish Balay 787827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 788827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 789827bd09bSSatish Balay 790827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 791827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 792827bd09bSSatish Balay if (*pi > *pj) 793827bd09bSSatish Balay {SWAP(*pi,*pj)} 794827bd09bSSatish Balay if (*ar > *pj) 795827bd09bSSatish Balay {SWAP(*ar,*pj)} 796827bd09bSSatish Balay else if (*pi > *ar) 797827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 798827bd09bSSatish Balay 799827bd09bSSatish Balay /* partition about pivot_value ... */ 800827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 801827bd09bSSatish Balay for(;;) 802827bd09bSSatish Balay { 803827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 804827bd09bSSatish Balay do pi++; while (*pi<*ar); 805827bd09bSSatish Balay do pj--; while (*pj>*ar); 806827bd09bSSatish Balay 807827bd09bSSatish Balay /* if we've crossed we're done */ 808827bd09bSSatish Balay if (pj<pi) break; 809827bd09bSSatish Balay 810827bd09bSSatish Balay /* else swap */ 811827bd09bSSatish Balay SWAP(*pi,*pj) 812827bd09bSSatish Balay } 813827bd09bSSatish Balay 814827bd09bSSatish Balay /* place pivot_value in it's correct location */ 815827bd09bSSatish Balay SWAP(*ar,*pj) 816827bd09bSSatish Balay 817827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 818827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 819827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 820827bd09bSSatish Balay 821827bd09bSSatish Balay /* push right hand child iff length > 1 */ 822827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 823827bd09bSSatish Balay { 824827bd09bSSatish Balay *(top_a++) = pi; 825827bd09bSSatish Balay size -= *top_s+2; 826827bd09bSSatish Balay top_s++; 827827bd09bSSatish Balay } 828827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 829827bd09bSSatish Balay else if (size -= *top_s+2) 830827bd09bSSatish Balay {;} 831827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 832827bd09bSSatish Balay else 833827bd09bSSatish Balay { 834827bd09bSSatish Balay ar = *(--top_a); 835827bd09bSSatish Balay size = *(--top_s); 836827bd09bSSatish Balay } 837827bd09bSSatish Balay } 838827bd09bSSatish Balay 839827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 840827bd09bSSatish Balay else 841827bd09bSSatish Balay { 842827bd09bSSatish Balay /* insertion sort for bottom */ 843827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 844827bd09bSSatish Balay { 845827bd09bSSatish Balay temp = *pj; 846827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 847827bd09bSSatish Balay { 848827bd09bSSatish Balay if (*pi <= temp) break; 849827bd09bSSatish Balay *(pi+1)=*pi; 850827bd09bSSatish Balay } 851827bd09bSSatish Balay *(pi+1)=temp; 852827bd09bSSatish Balay } 853827bd09bSSatish Balay 854827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 855*3fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 856827bd09bSSatish Balay 857827bd09bSSatish Balay /* else pop another list from the stack */ 858827bd09bSSatish Balay ar = *(--top_a); 859827bd09bSSatish Balay size = *(--top_s); 860827bd09bSSatish Balay } 861827bd09bSSatish Balay } 862*3fdc5746SBarry Smith PetscFunctionReturn(0); 863827bd09bSSatish Balay } 864827bd09bSSatish Balay 865827bd09bSSatish Balay 866827bd09bSSatish Balay 867827bd09bSSatish Balay /****************************************************************************** 868827bd09bSSatish Balay Function: ivec_sort_companion(). 869827bd09bSSatish Balay 870827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 871827bd09bSSatish Balay Output: sorted list (in ascending order). 872827bd09bSSatish Balay Return: none. 873827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 874827bd09bSSatish Balay ******************************************************************************/ 875*3fdc5746SBarry Smith PetscErrorCode 876a501084fSBarry Smith ivec_sort_companion( int *ar, int *ar2, int size) 877827bd09bSSatish Balay { 878a501084fSBarry Smith int *pi, *pj, temp, temp2; 879a501084fSBarry Smith int **top_a = (int **)offset_stack; 880a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 881a501084fSBarry Smith int *pi2, *pj2; 882a501084fSBarry Smith int mid; 883827bd09bSSatish Balay 884*3fdc5746SBarry Smith PetscFunctionBegin; 885827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 886827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 887827bd09bSSatish Balay size--; 888827bd09bSSatish Balay 889827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 890827bd09bSSatish Balay for (;;) 891827bd09bSSatish Balay { 892827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 893827bd09bSSatish Balay if (size > SORT_OPT) 894827bd09bSSatish Balay { 895827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 896827bd09bSSatish Balay mid = size>>1; 897827bd09bSSatish Balay pi = ar+1; 898827bd09bSSatish Balay pj = ar+mid; 899827bd09bSSatish Balay pi2 = ar2+1; 900827bd09bSSatish Balay pj2 = ar2+mid; 901827bd09bSSatish Balay 902827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 903827bd09bSSatish Balay SWAP(*pi,*pj) 904827bd09bSSatish Balay SWAP(*pi2,*pj2) 905827bd09bSSatish Balay 906827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 907827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 908827bd09bSSatish Balay pj = ar+size; 909827bd09bSSatish Balay pj2 = ar2+size; 910827bd09bSSatish Balay if (*pi > *pj) 911827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 912827bd09bSSatish Balay if (*ar > *pj) 913827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 914827bd09bSSatish Balay else if (*pi > *ar) 915827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 916827bd09bSSatish Balay 917827bd09bSSatish Balay /* partition about pivot_value ... */ 918827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 919827bd09bSSatish Balay for(;;) 920827bd09bSSatish Balay { 921827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 922827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 923827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 924827bd09bSSatish Balay 925827bd09bSSatish Balay /* if we've crossed we're done */ 926827bd09bSSatish Balay if (pj<pi) break; 927827bd09bSSatish Balay 928827bd09bSSatish Balay /* else swap */ 929827bd09bSSatish Balay SWAP(*pi,*pj) 930827bd09bSSatish Balay SWAP(*pi2,*pj2) 931827bd09bSSatish Balay } 932827bd09bSSatish Balay 933827bd09bSSatish Balay /* place pivot_value in it's correct location */ 934827bd09bSSatish Balay SWAP(*ar,*pj) 935827bd09bSSatish Balay SWAP(*ar2,*pj2) 936827bd09bSSatish Balay 937827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 938827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 939827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 940827bd09bSSatish Balay 941827bd09bSSatish Balay /* push right hand child iff length > 1 */ 942827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 943827bd09bSSatish Balay { 944827bd09bSSatish Balay *(top_a++) = pi; 945827bd09bSSatish Balay *(top_a++) = pi2; 946827bd09bSSatish Balay size -= *top_s+2; 947827bd09bSSatish Balay top_s++; 948827bd09bSSatish Balay } 949827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 950827bd09bSSatish Balay else if (size -= *top_s+2) 951827bd09bSSatish Balay {;} 952827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 953827bd09bSSatish Balay else 954827bd09bSSatish Balay { 955827bd09bSSatish Balay ar2 = *(--top_a); 956827bd09bSSatish Balay ar = *(--top_a); 957827bd09bSSatish Balay size = *(--top_s); 958827bd09bSSatish Balay } 959827bd09bSSatish Balay } 960827bd09bSSatish Balay 961827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 962827bd09bSSatish Balay else 963827bd09bSSatish Balay { 964827bd09bSSatish Balay /* insertion sort for bottom */ 965827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 966827bd09bSSatish Balay { 967827bd09bSSatish Balay temp = *pj; 968827bd09bSSatish Balay temp2 = *pj2; 969827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 970827bd09bSSatish Balay { 971827bd09bSSatish Balay if (*pi <= temp) break; 972827bd09bSSatish Balay *(pi+1)=*pi; 973827bd09bSSatish Balay *(pi2+1)=*pi2; 974827bd09bSSatish Balay } 975827bd09bSSatish Balay *(pi+1)=temp; 976827bd09bSSatish Balay *(pi2+1)=temp2; 977827bd09bSSatish Balay } 978827bd09bSSatish Balay 979827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 980*3fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 981827bd09bSSatish Balay 982827bd09bSSatish Balay /* else pop another list from the stack */ 983827bd09bSSatish Balay ar2 = *(--top_a); 984827bd09bSSatish Balay ar = *(--top_a); 985827bd09bSSatish Balay size = *(--top_s); 986827bd09bSSatish Balay } 987827bd09bSSatish Balay } 988*3fdc5746SBarry Smith PetscFunctionReturn(0); 989827bd09bSSatish Balay } 990827bd09bSSatish Balay 991827bd09bSSatish Balay 992827bd09bSSatish Balay 993827bd09bSSatish Balay /****************************************************************************** 994827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 995827bd09bSSatish Balay 996827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 997827bd09bSSatish Balay Output: sorted list (in ascending order). 998827bd09bSSatish Balay Return: none. 999827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1000827bd09bSSatish Balay ******************************************************************************/ 1001*3fdc5746SBarry Smith PetscErrorCode 1002a501084fSBarry Smith ivec_sort_companion_hack( int *ar, int **ar2, 1003a501084fSBarry Smith int size) 1004827bd09bSSatish Balay { 1005a501084fSBarry Smith int *pi, *pj, temp, *ptr; 1006a501084fSBarry Smith int **top_a = (int **)offset_stack; 1007a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 1008a501084fSBarry Smith int **pi2, **pj2; 1009a501084fSBarry Smith int mid; 1010827bd09bSSatish Balay 1011*3fdc5746SBarry Smith PetscFunctionBegin; 1012827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1013827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1014827bd09bSSatish Balay size--; 1015827bd09bSSatish Balay 1016827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1017827bd09bSSatish Balay for (;;) 1018827bd09bSSatish Balay { 1019827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1020827bd09bSSatish Balay if (size > SORT_OPT) 1021827bd09bSSatish Balay { 1022827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1023827bd09bSSatish Balay mid = size>>1; 1024827bd09bSSatish Balay pi = ar+1; 1025827bd09bSSatish Balay pj = ar+mid; 1026827bd09bSSatish Balay pi2 = ar2+1; 1027827bd09bSSatish Balay pj2 = ar2+mid; 1028827bd09bSSatish Balay 1029827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1030827bd09bSSatish Balay SWAP(*pi,*pj) 1031827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1032827bd09bSSatish Balay 1033827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1034827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1035827bd09bSSatish Balay pj = ar+size; 1036827bd09bSSatish Balay pj2 = ar2+size; 1037827bd09bSSatish Balay if (*pi > *pj) 1038827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1039827bd09bSSatish Balay if (*ar > *pj) 1040827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1041827bd09bSSatish Balay else if (*pi > *ar) 1042827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1043827bd09bSSatish Balay 1044827bd09bSSatish Balay /* partition about pivot_value ... */ 1045827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1046827bd09bSSatish Balay for(;;) 1047827bd09bSSatish Balay { 1048827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1049827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1050827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1051827bd09bSSatish Balay 1052827bd09bSSatish Balay /* if we've crossed we're done */ 1053827bd09bSSatish Balay if (pj<pi) break; 1054827bd09bSSatish Balay 1055827bd09bSSatish Balay /* else swap */ 1056827bd09bSSatish Balay SWAP(*pi,*pj) 1057827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1058827bd09bSSatish Balay } 1059827bd09bSSatish Balay 1060827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1061827bd09bSSatish Balay SWAP(*ar,*pj) 1062827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1063827bd09bSSatish Balay 1064827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1065827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1066827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1067827bd09bSSatish Balay 1068827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1069827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1070827bd09bSSatish Balay { 1071827bd09bSSatish Balay *(top_a++) = pi; 1072827bd09bSSatish Balay *(top_a++) = (int*) pi2; 1073827bd09bSSatish Balay size -= *top_s+2; 1074827bd09bSSatish Balay top_s++; 1075827bd09bSSatish Balay } 1076827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1077827bd09bSSatish Balay else if (size -= *top_s+2) 1078827bd09bSSatish Balay {;} 1079827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1080827bd09bSSatish Balay else 1081827bd09bSSatish Balay { 1082827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1083827bd09bSSatish Balay ar = *(--top_a); 1084827bd09bSSatish Balay size = *(--top_s); 1085827bd09bSSatish Balay } 1086827bd09bSSatish Balay } 1087827bd09bSSatish Balay 1088827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1089827bd09bSSatish Balay else 1090827bd09bSSatish Balay { 1091827bd09bSSatish Balay /* insertion sort for bottom */ 1092827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1093827bd09bSSatish Balay { 1094827bd09bSSatish Balay temp = *pj; 1095827bd09bSSatish Balay ptr = *pj2; 1096827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1097827bd09bSSatish Balay { 1098827bd09bSSatish Balay if (*pi <= temp) break; 1099827bd09bSSatish Balay *(pi+1)=*pi; 1100827bd09bSSatish Balay *(pi2+1)=*pi2; 1101827bd09bSSatish Balay } 1102827bd09bSSatish Balay *(pi+1)=temp; 1103827bd09bSSatish Balay *(pi2+1)=ptr; 1104827bd09bSSatish Balay } 1105827bd09bSSatish Balay 1106827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1107*3fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1108827bd09bSSatish Balay 1109827bd09bSSatish Balay /* else pop another list from the stack */ 1110827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1111827bd09bSSatish Balay ar = *(--top_a); 1112827bd09bSSatish Balay size = *(--top_s); 1113827bd09bSSatish Balay } 1114827bd09bSSatish Balay } 1115*3fdc5746SBarry Smith PetscFunctionReturn(0); 1116827bd09bSSatish Balay } 1117827bd09bSSatish Balay 1118827bd09bSSatish Balay 1119827bd09bSSatish Balay 1120827bd09bSSatish Balay /****************************************************************************** 1121827bd09bSSatish Balay Function: SMI_sort(). 1122827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1123827bd09bSSatish Balay Output: sorted list (in ascending order). 1124827bd09bSSatish Balay Return: none. 1125827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1126827bd09bSSatish Balay ******************************************************************************/ 1127*3fdc5746SBarry Smith PetscErrorCode 1128827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type) 1129827bd09bSSatish Balay { 1130*3fdc5746SBarry Smith PetscFunctionBegin; 1131827bd09bSSatish Balay if (type == SORT_INTEGER) 1132827bd09bSSatish Balay { 1133827bd09bSSatish Balay if (ar2) 1134827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 1135827bd09bSSatish Balay else 1136827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1137827bd09bSSatish Balay } 1138827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1139827bd09bSSatish Balay { 1140827bd09bSSatish Balay if (ar2) 1141827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 1142827bd09bSSatish Balay else 1143827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1144827bd09bSSatish Balay } 1145827bd09bSSatish Balay 1146827bd09bSSatish Balay else 1147827bd09bSSatish Balay { 1148827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1149827bd09bSSatish Balay } 1150*3fdc5746SBarry Smith PetscFunctionReturn(0); 1151827bd09bSSatish Balay } 1152827bd09bSSatish Balay 1153827bd09bSSatish Balay 1154827bd09bSSatish Balay 1155827bd09bSSatish Balay /**********************************ivec.c************************************** 1156827bd09bSSatish Balay Function ivec_linear_search() 1157827bd09bSSatish Balay 1158827bd09bSSatish Balay Input : 1159827bd09bSSatish Balay Output: 1160827bd09bSSatish Balay Return: 1161827bd09bSSatish Balay Description: 1162827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1163827bd09bSSatish Balay int 1164a501084fSBarry Smith ivec_linear_search( int item, int *list, int n) 1165827bd09bSSatish Balay { 1166a501084fSBarry Smith int tmp = n-1; 1167*3fdc5746SBarry Smith PetscFunctionBegin; 1168827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1169827bd09bSSatish Balay return(-1); 1170827bd09bSSatish Balay } 1171827bd09bSSatish Balay 1172827bd09bSSatish Balay 1173827bd09bSSatish Balay 1174827bd09bSSatish Balay /**********************************ivec.c************************************** 1175827bd09bSSatish Balay Function ivec_binary_search() 1176827bd09bSSatish Balay 1177827bd09bSSatish Balay Input : 1178827bd09bSSatish Balay Output: 1179827bd09bSSatish Balay Return: 1180827bd09bSSatish Balay Description: 1181827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1182827bd09bSSatish Balay int 1183a501084fSBarry Smith ivec_binary_search( int item, int *list, int rh) 1184827bd09bSSatish Balay { 1185a501084fSBarry Smith int mid, lh=0; 1186827bd09bSSatish Balay 1187827bd09bSSatish Balay rh--; 1188827bd09bSSatish Balay while (lh<=rh) 1189827bd09bSSatish Balay { 1190827bd09bSSatish Balay mid = (lh+rh)>>1; 1191827bd09bSSatish Balay if (*(list+mid) == item) 1192827bd09bSSatish Balay {return(mid);} 1193827bd09bSSatish Balay if (*(list+mid) > item) 1194827bd09bSSatish Balay {rh = mid-1;} 1195827bd09bSSatish Balay else 1196827bd09bSSatish Balay {lh = mid+1;} 1197827bd09bSSatish Balay } 1198827bd09bSSatish Balay return(-1); 1199827bd09bSSatish Balay } 1200827bd09bSSatish Balay 1201827bd09bSSatish Balay 1202827bd09bSSatish Balay 1203827bd09bSSatish Balay /**********************************ivec.c************************************** 1204827bd09bSSatish Balay Function rvec_dump 1205827bd09bSSatish Balay 1206827bd09bSSatish Balay Input : 1207827bd09bSSatish Balay Output: 1208827bd09bSSatish Balay Return: 1209827bd09bSSatish Balay Description: 1210827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1211*3fdc5746SBarry Smith PetscErrorCode 1212a501084fSBarry Smith rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s) 1213827bd09bSSatish Balay { 1214827bd09bSSatish Balay int i; 1215*3fdc5746SBarry Smith PetscFunctionBegin; 1216827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1217827bd09bSSatish Balay for (i=0;i<n;i++) 1218827bd09bSSatish Balay {printf("%f ",v[i]);} 1219827bd09bSSatish Balay printf("\n"); 1220827bd09bSSatish Balay fflush(stdout); 1221*3fdc5746SBarry Smith PetscFunctionReturn(0); 1222827bd09bSSatish Balay } 1223827bd09bSSatish Balay 1224827bd09bSSatish Balay 1225827bd09bSSatish Balay 1226827bd09bSSatish Balay /**********************************ivec.c************************************** 1227827bd09bSSatish Balay Function rvec_lb_ub() 1228827bd09bSSatish Balay 1229827bd09bSSatish Balay Input : 1230827bd09bSSatish Balay Output: 1231827bd09bSSatish Balay Return: 1232827bd09bSSatish Balay Description: 1233827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1234*3fdc5746SBarry Smith PetscErrorCode 1235a501084fSBarry Smith rvec_lb_ub( PetscScalar *arg1, int n, PetscScalar *lb, PetscScalar *ub) 1236827bd09bSSatish Balay { 1237a501084fSBarry Smith PetscScalar min = REAL_MAX; 1238a501084fSBarry Smith PetscScalar max = -REAL_MAX; 1239827bd09bSSatish Balay 1240*3fdc5746SBarry Smith PetscFunctionBegin; 1241827bd09bSSatish Balay while (n--) 1242827bd09bSSatish Balay { 124339945688SSatish Balay min = PetscMin(min,*arg1); 124439945688SSatish Balay max = PetscMax(max,*arg1); 1245827bd09bSSatish Balay arg1++; 1246827bd09bSSatish Balay } 1247827bd09bSSatish Balay 1248827bd09bSSatish Balay *lb=min; 1249827bd09bSSatish Balay *ub=max; 1250*3fdc5746SBarry Smith PetscFunctionReturn(0); 1251827bd09bSSatish Balay } 1252827bd09bSSatish Balay 1253827bd09bSSatish Balay 1254827bd09bSSatish Balay 1255827bd09bSSatish Balay /********************************ivec.c************************************** 1256827bd09bSSatish Balay Function rvec_copy() 1257827bd09bSSatish Balay 1258827bd09bSSatish Balay Input : 1259827bd09bSSatish Balay Output: 1260827bd09bSSatish Balay Return: 1261827bd09bSSatish Balay Description: 1262827bd09bSSatish Balay *********************************ivec.c*************************************/ 1263*3fdc5746SBarry Smith PetscErrorCode 1264a501084fSBarry Smith rvec_copy( PetscScalar *arg1, PetscScalar *arg2, int n) 1265827bd09bSSatish Balay { 1266*3fdc5746SBarry Smith PetscFunctionBegin; 1267827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 1268*3fdc5746SBarry Smith PetscFunctionReturn(0); 1269827bd09bSSatish Balay } 1270827bd09bSSatish Balay 1271827bd09bSSatish Balay 1272827bd09bSSatish Balay 1273827bd09bSSatish Balay /********************************ivec.c************************************** 1274827bd09bSSatish Balay Function rvec_zero() 1275827bd09bSSatish Balay 1276827bd09bSSatish Balay Input : 1277827bd09bSSatish Balay Output: 1278827bd09bSSatish Balay Return: 1279827bd09bSSatish Balay Description: 1280827bd09bSSatish Balay *********************************ivec.c*************************************/ 1281*3fdc5746SBarry Smith PetscErrorCode 1282a501084fSBarry Smith rvec_zero( PetscScalar *arg1, int n) 1283827bd09bSSatish Balay { 1284*3fdc5746SBarry Smith PetscFunctionBegin; 1285827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 1286*3fdc5746SBarry Smith PetscFunctionReturn(0); 1287827bd09bSSatish Balay } 1288827bd09bSSatish Balay 1289827bd09bSSatish Balay 1290827bd09bSSatish Balay 1291827bd09bSSatish Balay /**********************************ivec.c************************************** 1292827bd09bSSatish Balay Function rvec_one() 1293827bd09bSSatish Balay 1294827bd09bSSatish Balay Input : 1295827bd09bSSatish Balay Output: 1296827bd09bSSatish Balay Return: 1297827bd09bSSatish Balay Description: 1298827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1299*3fdc5746SBarry Smith PetscErrorCode 1300a501084fSBarry Smith rvec_one( PetscScalar *arg1, int n) 1301827bd09bSSatish Balay { 1302*3fdc5746SBarry Smith PetscFunctionBegin; 1303827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 1304*3fdc5746SBarry Smith PetscFunctionReturn(0); 1305827bd09bSSatish Balay } 1306827bd09bSSatish Balay 1307827bd09bSSatish Balay 1308827bd09bSSatish Balay 1309827bd09bSSatish Balay /**********************************ivec.c************************************** 1310827bd09bSSatish Balay Function rvec_neg_one() 1311827bd09bSSatish Balay 1312827bd09bSSatish Balay Input : 1313827bd09bSSatish Balay Output: 1314827bd09bSSatish Balay Return: 1315827bd09bSSatish Balay Description: 1316827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1317*3fdc5746SBarry Smith PetscErrorCode 1318a501084fSBarry Smith rvec_neg_one( PetscScalar *arg1, int n) 1319827bd09bSSatish Balay { 1320*3fdc5746SBarry Smith PetscFunctionBegin; 1321827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 1322*3fdc5746SBarry Smith PetscFunctionReturn(0); 1323827bd09bSSatish Balay } 1324827bd09bSSatish Balay 1325827bd09bSSatish Balay 1326827bd09bSSatish Balay 1327827bd09bSSatish Balay /**********************************ivec.c************************************** 1328827bd09bSSatish Balay Function rvec_set() 1329827bd09bSSatish Balay 1330827bd09bSSatish Balay Input : 1331827bd09bSSatish Balay Output: 1332827bd09bSSatish Balay Return: 1333827bd09bSSatish Balay Description: 1334827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1335*3fdc5746SBarry Smith PetscErrorCode 1336a501084fSBarry Smith rvec_set( PetscScalar *arg1, PetscScalar arg2, int n) 1337827bd09bSSatish Balay { 1338*3fdc5746SBarry Smith PetscFunctionBegin; 1339827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 1340*3fdc5746SBarry Smith PetscFunctionReturn(0); 1341827bd09bSSatish Balay } 1342827bd09bSSatish Balay 1343827bd09bSSatish Balay 1344827bd09bSSatish Balay 1345827bd09bSSatish Balay /**********************************ivec.c************************************** 1346827bd09bSSatish Balay Function rvec_scale() 1347827bd09bSSatish Balay 1348827bd09bSSatish Balay Input : 1349827bd09bSSatish Balay Output: 1350827bd09bSSatish Balay Return: 1351827bd09bSSatish Balay Description: 1352827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1353*3fdc5746SBarry Smith PetscErrorCode 1354a501084fSBarry Smith rvec_scale( PetscScalar *arg1, PetscScalar arg2, int n) 1355827bd09bSSatish Balay { 1356*3fdc5746SBarry Smith PetscFunctionBegin; 1357827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 1358*3fdc5746SBarry Smith PetscFunctionReturn(0); 1359827bd09bSSatish Balay } 1360827bd09bSSatish Balay 1361827bd09bSSatish Balay 1362827bd09bSSatish Balay 1363827bd09bSSatish Balay /********************************ivec.c************************************** 1364827bd09bSSatish Balay Function rvec_add() 1365827bd09bSSatish Balay 1366827bd09bSSatish Balay Input : 1367827bd09bSSatish Balay Output: 1368827bd09bSSatish Balay Return: 1369827bd09bSSatish Balay Description: 1370827bd09bSSatish Balay *********************************ivec.c*************************************/ 1371*3fdc5746SBarry Smith PetscErrorCode 1372a501084fSBarry Smith rvec_add( PetscScalar *arg1, PetscScalar *arg2, int n) 1373827bd09bSSatish Balay { 1374*3fdc5746SBarry Smith PetscFunctionBegin; 1375827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1376*3fdc5746SBarry Smith PetscFunctionReturn(0); 1377827bd09bSSatish Balay } 1378827bd09bSSatish Balay 1379827bd09bSSatish Balay 1380827bd09bSSatish Balay 1381827bd09bSSatish Balay /********************************ivec.c************************************** 1382827bd09bSSatish Balay Function rvec_dot() 1383827bd09bSSatish Balay 1384827bd09bSSatish Balay Input : 1385827bd09bSSatish Balay Output: 1386827bd09bSSatish Balay Return: 1387827bd09bSSatish Balay Description: 1388827bd09bSSatish Balay *********************************ivec.c*************************************/ 1389a501084fSBarry Smith PetscScalar 1390a501084fSBarry Smith rvec_dot( PetscScalar *arg1, PetscScalar *arg2, int n) 1391827bd09bSSatish Balay { 1392a501084fSBarry Smith PetscScalar dot=0.0; 1393827bd09bSSatish Balay 1394827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1395827bd09bSSatish Balay 1396827bd09bSSatish Balay return(dot); 1397827bd09bSSatish Balay } 1398827bd09bSSatish Balay 1399827bd09bSSatish Balay 1400827bd09bSSatish Balay 1401827bd09bSSatish Balay /********************************ivec.c************************************** 1402827bd09bSSatish Balay Function rvec_axpy() 1403827bd09bSSatish Balay 1404827bd09bSSatish Balay Input : 1405827bd09bSSatish Balay Output: 1406827bd09bSSatish Balay Return: 1407827bd09bSSatish Balay Description: 1408827bd09bSSatish Balay *********************************ivec.c*************************************/ 1409*3fdc5746SBarry Smith PetscErrorCode 1410a501084fSBarry Smith rvec_axpy( PetscScalar *arg1, PetscScalar *arg2, PetscScalar scale, 1411a501084fSBarry Smith int n) 1412827bd09bSSatish Balay { 1413*3fdc5746SBarry Smith PetscFunctionBegin; 1414827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 1415*3fdc5746SBarry Smith PetscFunctionReturn(0); 1416827bd09bSSatish Balay } 1417827bd09bSSatish Balay 1418827bd09bSSatish Balay 1419827bd09bSSatish Balay /********************************ivec.c************************************** 1420827bd09bSSatish Balay Function rvec_mult() 1421827bd09bSSatish Balay 1422827bd09bSSatish Balay Input : 1423827bd09bSSatish Balay Output: 1424827bd09bSSatish Balay Return: 1425827bd09bSSatish Balay Description: 1426827bd09bSSatish Balay *********************************ivec.c*************************************/ 1427*3fdc5746SBarry Smith PetscErrorCode 1428a501084fSBarry Smith rvec_mult( PetscScalar *arg1, PetscScalar *arg2, int n) 1429827bd09bSSatish Balay { 1430*3fdc5746SBarry Smith PetscFunctionBegin; 1431827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1432*3fdc5746SBarry Smith PetscFunctionReturn(0); 1433827bd09bSSatish Balay } 1434827bd09bSSatish Balay 1435827bd09bSSatish Balay 1436827bd09bSSatish Balay 1437827bd09bSSatish Balay /********************************ivec.c************************************** 1438827bd09bSSatish Balay Function rvec_max() 1439827bd09bSSatish Balay 1440827bd09bSSatish Balay Input : 1441827bd09bSSatish Balay Output: 1442827bd09bSSatish Balay Return: 1443827bd09bSSatish Balay Description: 1444827bd09bSSatish Balay *********************************ivec.c*************************************/ 1445*3fdc5746SBarry Smith PetscErrorCode 1446a501084fSBarry Smith rvec_max( PetscScalar *arg1, PetscScalar *arg2, int n) 1447827bd09bSSatish Balay { 1448*3fdc5746SBarry Smith PetscFunctionBegin; 144939945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 1450*3fdc5746SBarry Smith PetscFunctionReturn(0); 1451827bd09bSSatish Balay } 1452827bd09bSSatish Balay 1453827bd09bSSatish Balay 1454827bd09bSSatish Balay 1455827bd09bSSatish Balay /********************************ivec.c************************************** 1456827bd09bSSatish Balay Function rvec_max_abs() 1457827bd09bSSatish Balay 1458827bd09bSSatish Balay Input : 1459827bd09bSSatish Balay Output: 1460827bd09bSSatish Balay Return: 1461827bd09bSSatish Balay Description: 1462827bd09bSSatish Balay *********************************ivec.c*************************************/ 1463*3fdc5746SBarry Smith PetscErrorCode 1464a501084fSBarry Smith rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1465827bd09bSSatish Balay { 1466*3fdc5746SBarry Smith PetscFunctionBegin; 1467827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 1468*3fdc5746SBarry Smith PetscFunctionReturn(0); 1469827bd09bSSatish Balay } 1470827bd09bSSatish Balay 1471827bd09bSSatish Balay 1472827bd09bSSatish Balay 1473827bd09bSSatish Balay /********************************ivec.c************************************** 1474827bd09bSSatish Balay Function rvec_min() 1475827bd09bSSatish Balay 1476827bd09bSSatish Balay Input : 1477827bd09bSSatish Balay Output: 1478827bd09bSSatish Balay Return: 1479827bd09bSSatish Balay Description: 1480827bd09bSSatish Balay *********************************ivec.c*************************************/ 1481*3fdc5746SBarry Smith PetscErrorCode 1482a501084fSBarry Smith rvec_min( PetscScalar *arg1, PetscScalar *arg2, int n) 1483827bd09bSSatish Balay { 1484*3fdc5746SBarry Smith PetscFunctionBegin; 148539945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 1486*3fdc5746SBarry Smith PetscFunctionReturn(0); 1487827bd09bSSatish Balay } 1488827bd09bSSatish Balay 1489827bd09bSSatish Balay 1490827bd09bSSatish Balay 1491827bd09bSSatish Balay /********************************ivec.c************************************** 1492827bd09bSSatish Balay Function rvec_min_abs() 1493827bd09bSSatish Balay 1494827bd09bSSatish Balay Input : 1495827bd09bSSatish Balay Output: 1496827bd09bSSatish Balay Return: 1497827bd09bSSatish Balay Description: 1498827bd09bSSatish Balay *********************************ivec.c*************************************/ 1499*3fdc5746SBarry Smith PetscErrorCode 1500a501084fSBarry Smith rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1501827bd09bSSatish Balay { 1502*3fdc5746SBarry Smith PetscFunctionBegin; 1503827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 1504*3fdc5746SBarry Smith PetscFunctionReturn(0); 1505827bd09bSSatish Balay } 1506827bd09bSSatish Balay 1507827bd09bSSatish Balay 1508827bd09bSSatish Balay 1509827bd09bSSatish Balay /********************************ivec.c************************************** 1510827bd09bSSatish Balay Function rvec_exists() 1511827bd09bSSatish Balay 1512827bd09bSSatish Balay Input : 1513827bd09bSSatish Balay Output: 1514827bd09bSSatish Balay Return: 1515827bd09bSSatish Balay Description: 1516827bd09bSSatish Balay *********************************ivec.c*************************************/ 1517*3fdc5746SBarry Smith PetscErrorCode 1518a501084fSBarry Smith rvec_exists( PetscScalar *arg1, PetscScalar *arg2, int n) 1519827bd09bSSatish Balay { 1520*3fdc5746SBarry Smith PetscFunctionBegin; 1521827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 1522*3fdc5746SBarry Smith PetscFunctionReturn(0); 1523827bd09bSSatish Balay } 1524827bd09bSSatish Balay 1525827bd09bSSatish Balay 1526827bd09bSSatish Balay 1527827bd09bSSatish Balay /**********************************ivec.c************************************** 1528827bd09bSSatish Balay Function rvec_non_uniform() 1529827bd09bSSatish Balay 1530827bd09bSSatish Balay Input : 1531827bd09bSSatish Balay Output: 1532827bd09bSSatish Balay Return: 1533827bd09bSSatish Balay Description: 1534827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1535*3fdc5746SBarry Smith PetscErrorCode 1536a501084fSBarry Smith rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, int n, int *arg3) 1537827bd09bSSatish Balay { 1538a501084fSBarry Smith int i, j, type; 1539827bd09bSSatish Balay 1540*3fdc5746SBarry Smith PetscFunctionBegin; 1541827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1542827bd09bSSatish Balay for (i=0;i<n;) 1543827bd09bSSatish Balay { 1544827bd09bSSatish Balay /* clump 'em for now */ 1545827bd09bSSatish Balay j=i+1; 1546827bd09bSSatish Balay type = arg3[i]; 1547827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1548827bd09bSSatish Balay {j++;} 1549827bd09bSSatish Balay 1550827bd09bSSatish Balay /* how many together */ 1551827bd09bSSatish Balay j -= i; 1552827bd09bSSatish Balay 1553827bd09bSSatish Balay /* call appropriate ivec function */ 1554827bd09bSSatish Balay if (type == GL_MAX) 1555827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1556827bd09bSSatish Balay else if (type == GL_MIN) 1557827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1558827bd09bSSatish Balay else if (type == GL_MULT) 1559827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1560827bd09bSSatish Balay else if (type == GL_ADD) 1561827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1562827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1563827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1564827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1565827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1566827bd09bSSatish Balay else if (type == GL_EXISTS) 1567827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1568827bd09bSSatish Balay else 1569827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1570827bd09bSSatish Balay 1571827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1572827bd09bSSatish Balay } 1573*3fdc5746SBarry Smith PetscFunctionReturn(0); 1574827bd09bSSatish Balay } 1575827bd09bSSatish Balay 1576827bd09bSSatish Balay 1577827bd09bSSatish Balay 1578827bd09bSSatish Balay /**********************************ivec.c************************************** 1579827bd09bSSatish Balay Function rvec_fct_addr() 1580827bd09bSSatish Balay 1581827bd09bSSatish Balay Input : 1582827bd09bSSatish Balay Output: 1583827bd09bSSatish Balay Return: 1584827bd09bSSatish Balay Description: 1585827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1586a501084fSBarry Smith vfp rvec_fct_addr( int type) 1587827bd09bSSatish Balay { 1588827bd09bSSatish Balay if (type == NON_UNIFORM) 1589*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);} 1590827bd09bSSatish Balay else if (type == GL_MAX) 1591*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);} 1592827bd09bSSatish Balay else if (type == GL_MIN) 1593*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);} 1594827bd09bSSatish Balay else if (type == GL_MULT) 1595*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);} 1596827bd09bSSatish Balay else if (type == GL_ADD) 1597*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);} 1598827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1599*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);} 1600827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1601*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);} 1602827bd09bSSatish Balay else if (type == GL_EXISTS) 1603*3fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);} 1604827bd09bSSatish Balay 1605827bd09bSSatish Balay /* catch all ... not good if we get here */ 1606827bd09bSSatish Balay return(NULL); 1607827bd09bSSatish Balay } 1608827bd09bSSatish Balay 1609827bd09bSSatish Balay 1610827bd09bSSatish Balay /****************************************************************************** 1611827bd09bSSatish Balay Function: my_sort(). 1612827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1613827bd09bSSatish Balay Output: sorted list (in ascending order). 1614827bd09bSSatish Balay Return: none. 1615827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1616827bd09bSSatish Balay ******************************************************************************/ 1617*3fdc5746SBarry Smith PetscErrorCode 1618a501084fSBarry Smith rvec_sort( PetscScalar *ar, int Size) 1619827bd09bSSatish Balay { 1620a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1621a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1622a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1623a501084fSBarry Smith long size = (long) Size; 1624827bd09bSSatish Balay 1625*3fdc5746SBarry Smith PetscFunctionBegin; 1626827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1627827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1628827bd09bSSatish Balay size--; 1629827bd09bSSatish Balay 1630827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1631827bd09bSSatish Balay for (;;) 1632827bd09bSSatish Balay { 1633827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1634827bd09bSSatish Balay if (size > SORT_OPT) 1635827bd09bSSatish Balay { 1636827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1637827bd09bSSatish Balay pi = ar+1; 1638827bd09bSSatish Balay pj = ar+size; 1639827bd09bSSatish Balay 1640827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1641827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1642827bd09bSSatish Balay 1643827bd09bSSatish Balay pj = ar+size; 1644827bd09bSSatish Balay 1645827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1646827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1647827bd09bSSatish Balay if (*pi > *pj) 1648827bd09bSSatish Balay {SWAP(*pi,*pj)} 1649827bd09bSSatish Balay if (*ar > *pj) 1650827bd09bSSatish Balay {SWAP(*ar,*pj)} 1651827bd09bSSatish Balay else if (*pi > *ar) 1652827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1653827bd09bSSatish Balay 1654827bd09bSSatish Balay /* partition about pivot_value ... */ 1655827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1656827bd09bSSatish Balay for(;;) 1657827bd09bSSatish Balay { 1658827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1659827bd09bSSatish Balay do pi++; while (*pi<*ar); 1660827bd09bSSatish Balay do pj--; while (*pj>*ar); 1661827bd09bSSatish Balay 1662827bd09bSSatish Balay /* if we've crossed we're done */ 1663827bd09bSSatish Balay if (pj<pi) break; 1664827bd09bSSatish Balay 1665827bd09bSSatish Balay /* else swap */ 1666827bd09bSSatish Balay SWAP(*pi,*pj) 1667827bd09bSSatish Balay } 1668827bd09bSSatish Balay 1669827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1670827bd09bSSatish Balay SWAP(*ar,*pj) 1671827bd09bSSatish Balay 1672827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1673827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1674827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1675827bd09bSSatish Balay 1676827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1677827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1678827bd09bSSatish Balay { 1679827bd09bSSatish Balay *(top_a++) = pi; 1680827bd09bSSatish Balay size -= *top_s+2; 1681827bd09bSSatish Balay top_s++; 1682827bd09bSSatish Balay } 1683827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1684827bd09bSSatish Balay else if (size -= *top_s+2) 1685827bd09bSSatish Balay {;} 1686827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1687827bd09bSSatish Balay else 1688827bd09bSSatish Balay { 1689827bd09bSSatish Balay ar = *(--top_a); 1690827bd09bSSatish Balay size = *(--top_s); 1691827bd09bSSatish Balay } 1692827bd09bSSatish Balay } 1693827bd09bSSatish Balay 1694827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1695827bd09bSSatish Balay else 1696827bd09bSSatish Balay { 1697827bd09bSSatish Balay /* insertion sort for bottom */ 1698827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1699827bd09bSSatish Balay { 1700827bd09bSSatish Balay temp = *pj; 1701827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1702827bd09bSSatish Balay { 1703827bd09bSSatish Balay if (*pi <= temp) break; 1704827bd09bSSatish Balay *(pi+1)=*pi; 1705827bd09bSSatish Balay } 1706827bd09bSSatish Balay *(pi+1)=temp; 1707827bd09bSSatish Balay } 1708827bd09bSSatish Balay 1709827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1710*3fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1711827bd09bSSatish Balay 1712827bd09bSSatish Balay /* else pop another list from the stack */ 1713827bd09bSSatish Balay ar = *(--top_a); 1714827bd09bSSatish Balay size = *(--top_s); 1715827bd09bSSatish Balay } 1716827bd09bSSatish Balay } 1717*3fdc5746SBarry Smith PetscFunctionReturn(0); 1718827bd09bSSatish Balay } 1719827bd09bSSatish Balay 1720827bd09bSSatish Balay 1721827bd09bSSatish Balay 1722827bd09bSSatish Balay /****************************************************************************** 1723827bd09bSSatish Balay Function: my_sort(). 1724827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1725827bd09bSSatish Balay Output: sorted list (in ascending order). 1726827bd09bSSatish Balay Return: none. 1727827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1728827bd09bSSatish Balay ******************************************************************************/ 1729*3fdc5746SBarry Smith PetscErrorCode 1730a501084fSBarry Smith rvec_sort_companion( PetscScalar *ar, int *ar2, int Size) 1731827bd09bSSatish Balay { 1732a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1733a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1734a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1735a501084fSBarry Smith long size = (long) Size; 1736827bd09bSSatish Balay 1737a501084fSBarry Smith int *pi2, *pj2; 1738a501084fSBarry Smith int ptr; 1739a501084fSBarry Smith long mid; 1740827bd09bSSatish Balay 1741*3fdc5746SBarry Smith PetscFunctionBegin; 1742827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1743827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1744827bd09bSSatish Balay size--; 1745827bd09bSSatish Balay 1746827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1747827bd09bSSatish Balay for (;;) 1748827bd09bSSatish Balay { 1749827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1750827bd09bSSatish Balay if (size > SORT_OPT) 1751827bd09bSSatish Balay { 1752827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1753827bd09bSSatish Balay mid = size>>1; 1754827bd09bSSatish Balay pi = ar+1; 1755827bd09bSSatish Balay pj = ar+mid; 1756827bd09bSSatish Balay pi2 = ar2+1; 1757827bd09bSSatish Balay pj2 = ar2+mid; 1758827bd09bSSatish Balay 1759827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1760827bd09bSSatish Balay SWAP(*pi,*pj) 1761827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1762827bd09bSSatish Balay 1763827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1764827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1765827bd09bSSatish Balay pj = ar+size; 1766827bd09bSSatish Balay pj2 = ar2+size; 1767827bd09bSSatish Balay if (*pi > *pj) 1768827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1769827bd09bSSatish Balay if (*ar > *pj) 1770827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1771827bd09bSSatish Balay else if (*pi > *ar) 1772827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1773827bd09bSSatish Balay 1774827bd09bSSatish Balay /* partition about pivot_value ... */ 1775827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1776827bd09bSSatish Balay for(;;) 1777827bd09bSSatish Balay { 1778827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1779827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1780827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1781827bd09bSSatish Balay 1782827bd09bSSatish Balay /* if we've crossed we're done */ 1783827bd09bSSatish Balay if (pj<pi) break; 1784827bd09bSSatish Balay 1785827bd09bSSatish Balay /* else swap */ 1786827bd09bSSatish Balay SWAP(*pi,*pj) 1787827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1788827bd09bSSatish Balay } 1789827bd09bSSatish Balay 1790827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1791827bd09bSSatish Balay SWAP(*ar,*pj) 1792827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1793827bd09bSSatish Balay 1794827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1795827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1796827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1797827bd09bSSatish Balay 1798827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1799827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1800827bd09bSSatish Balay { 1801827bd09bSSatish Balay *(top_a++) = pi; 1802a501084fSBarry Smith *(top_a++) = (PetscScalar *) pi2; 1803827bd09bSSatish Balay size -= *top_s+2; 1804827bd09bSSatish Balay top_s++; 1805827bd09bSSatish Balay } 1806827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1807827bd09bSSatish Balay else if (size -= *top_s+2) 1808827bd09bSSatish Balay {;} 1809827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1810827bd09bSSatish Balay else 1811827bd09bSSatish Balay { 1812827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1813827bd09bSSatish Balay ar = *(--top_a); 1814827bd09bSSatish Balay size = *(--top_s); 1815827bd09bSSatish Balay } 1816827bd09bSSatish Balay } 1817827bd09bSSatish Balay 1818827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1819827bd09bSSatish Balay else 1820827bd09bSSatish Balay { 1821827bd09bSSatish Balay /* insertion sort for bottom */ 1822827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1823827bd09bSSatish Balay { 1824827bd09bSSatish Balay temp = *pj; 1825827bd09bSSatish Balay ptr = *pj2; 1826827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1827827bd09bSSatish Balay { 1828827bd09bSSatish Balay if (*pi <= temp) break; 1829827bd09bSSatish Balay *(pi+1)=*pi; 1830827bd09bSSatish Balay *(pi2+1)=*pi2; 1831827bd09bSSatish Balay } 1832827bd09bSSatish Balay *(pi+1)=temp; 1833827bd09bSSatish Balay *(pi2+1)=ptr; 1834827bd09bSSatish Balay } 1835827bd09bSSatish Balay 1836827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1837*3fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1838827bd09bSSatish Balay 1839827bd09bSSatish Balay /* else pop another list from the stack */ 1840827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1841827bd09bSSatish Balay ar = *(--top_a); 1842827bd09bSSatish Balay size = *(--top_s); 1843827bd09bSSatish Balay } 1844827bd09bSSatish Balay } 1845*3fdc5746SBarry Smith PetscFunctionReturn(0); 1846827bd09bSSatish Balay } 1847827bd09bSSatish Balay 1848827bd09bSSatish Balay 1849827bd09bSSatish Balay 1850827bd09bSSatish Balay 1851827bd09bSSatish Balay 1852827bd09bSSatish Balay /**********************************ivec.c************************************** 1853827bd09bSSatish Balay Function ivec_binary_search() 1854827bd09bSSatish Balay 1855827bd09bSSatish Balay Input : 1856827bd09bSSatish Balay Output: 1857827bd09bSSatish Balay Return: 1858827bd09bSSatish Balay Description: 1859827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1860827bd09bSSatish Balay int 1861a501084fSBarry Smith rvec_binary_search( PetscScalar item, PetscScalar *list, int rh) 1862827bd09bSSatish Balay { 1863a501084fSBarry Smith int mid, lh=0; 1864*3fdc5746SBarry Smith PetscFunctionBegin; 1865827bd09bSSatish Balay rh--; 1866827bd09bSSatish Balay while (lh<=rh) 1867827bd09bSSatish Balay { 1868827bd09bSSatish Balay mid = (lh+rh)>>1; 1869827bd09bSSatish Balay if (*(list+mid) == item) 1870827bd09bSSatish Balay {return(mid);} 1871827bd09bSSatish Balay if (*(list+mid) > item) 1872827bd09bSSatish Balay {rh = mid-1;} 1873827bd09bSSatish Balay else 1874827bd09bSSatish Balay {lh = mid+1;} 1875827bd09bSSatish Balay } 1876827bd09bSSatish Balay return(-1); 1877827bd09bSSatish Balay } 1878827bd09bSSatish Balay 1879827bd09bSSatish Balay 1880827bd09bSSatish Balay 1881827bd09bSSatish Balay 1882827bd09bSSatish Balay 1883