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*0924e98cSBarry Smith PetscErrorCode ivec_dump(int *v, int n, int tag, int tag2, char * s) 46827bd09bSSatish Balay { 47827bd09bSSatish Balay int i; 483fdc5746SBarry Smith PetscFunctionBegin; 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); 543fdc5746SBarry Smith PetscFunctionReturn(0); 55827bd09bSSatish Balay } 56827bd09bSSatish Balay 57827bd09bSSatish Balay 58827bd09bSSatish Balay 59827bd09bSSatish Balay /**********************************ivec.c************************************** 60827bd09bSSatish Balay Function ivec_lb_ub() 61827bd09bSSatish Balay 62827bd09bSSatish Balay Input : 63827bd09bSSatish Balay Output: 64827bd09bSSatish Balay Return: 65827bd09bSSatish Balay Description: 66827bd09bSSatish Balay ***********************************ivec.c*************************************/ 67*0924e98cSBarry Smith PetscErrorCode 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 723fdc5746SBarry Smith PetscFunctionBegin; 73827bd09bSSatish Balay while (n--) 74827bd09bSSatish Balay { 7539945688SSatish Balay min = PetscMin(min,*arg1); 7639945688SSatish Balay max = PetscMax(max,*arg1); 77827bd09bSSatish Balay arg1++; 78827bd09bSSatish Balay } 79827bd09bSSatish Balay 80827bd09bSSatish Balay *lb=min; 81827bd09bSSatish Balay *ub=max; 823fdc5746SBarry Smith PetscFunctionReturn(0); 83827bd09bSSatish Balay } 84827bd09bSSatish Balay 85827bd09bSSatish Balay 86827bd09bSSatish Balay 87827bd09bSSatish Balay /**********************************ivec.c************************************** 88827bd09bSSatish Balay Function ivec_copy() 89827bd09bSSatish Balay 90827bd09bSSatish Balay Input : 91827bd09bSSatish Balay Output: 92827bd09bSSatish Balay Return: 93827bd09bSSatish Balay Description: 94827bd09bSSatish Balay ***********************************ivec.c*************************************/ 95a501084fSBarry Smith int *ivec_copy( int *arg1, int *arg2, int n) 96827bd09bSSatish Balay { 97827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 98827bd09bSSatish Balay return(arg1); 99827bd09bSSatish Balay } 100827bd09bSSatish Balay 101827bd09bSSatish Balay 102827bd09bSSatish Balay 103827bd09bSSatish Balay /**********************************ivec.c************************************** 104827bd09bSSatish Balay Function ivec_zero() 105827bd09bSSatish Balay 106827bd09bSSatish Balay Input : 107827bd09bSSatish Balay Output: 108827bd09bSSatish Balay Return: 109827bd09bSSatish Balay Description: 110827bd09bSSatish Balay ***********************************ivec.c*************************************/ 111*0924e98cSBarry Smith PetscErrorCode ivec_zero( int *arg1, int n) 112827bd09bSSatish Balay { 1133fdc5746SBarry Smith PetscFunctionBegin; 114827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 1153fdc5746SBarry Smith PetscFunctionReturn(0); 116827bd09bSSatish Balay } 117827bd09bSSatish Balay 118827bd09bSSatish Balay 119827bd09bSSatish Balay 120827bd09bSSatish Balay /**********************************ivec.c************************************** 121827bd09bSSatish Balay Function ivec_comp() 122827bd09bSSatish Balay 123827bd09bSSatish Balay Input : 124827bd09bSSatish Balay Output: 125827bd09bSSatish Balay Return: 126827bd09bSSatish Balay Description: 127827bd09bSSatish Balay ***********************************ivec.c*************************************/ 128*0924e98cSBarry Smith PetscErrorCode ivec_comp( int *arg1, int n) 129827bd09bSSatish Balay { 1303fdc5746SBarry Smith PetscFunctionBegin; 131827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 1323fdc5746SBarry Smith PetscFunctionReturn(0); 133827bd09bSSatish Balay } 134827bd09bSSatish Balay 135827bd09bSSatish Balay 136827bd09bSSatish Balay 137827bd09bSSatish Balay /**********************************ivec.c************************************** 138827bd09bSSatish Balay Function ivec_neg_one() 139827bd09bSSatish Balay 140827bd09bSSatish Balay Input : 141827bd09bSSatish Balay Output: 142827bd09bSSatish Balay Return: 143827bd09bSSatish Balay Description: 144827bd09bSSatish Balay ***********************************ivec.c*************************************/ 145*0924e98cSBarry Smith PetscErrorCode ivec_neg_one( int *arg1, int n) 146827bd09bSSatish Balay { 1473fdc5746SBarry Smith PetscFunctionBegin; 148827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 1493fdc5746SBarry Smith PetscFunctionReturn(0); 150827bd09bSSatish Balay } 151827bd09bSSatish Balay 152827bd09bSSatish Balay 153827bd09bSSatish Balay 154827bd09bSSatish Balay /**********************************ivec.c************************************** 155827bd09bSSatish Balay Function ivec_pos_one() 156827bd09bSSatish Balay 157827bd09bSSatish Balay Input : 158827bd09bSSatish Balay Output: 159827bd09bSSatish Balay Return: 160827bd09bSSatish Balay Description: 161827bd09bSSatish Balay ***********************************ivec.c*************************************/ 162*0924e98cSBarry Smith PetscErrorCode ivec_pos_one( int *arg1, int n) 163827bd09bSSatish Balay { 1643fdc5746SBarry Smith PetscFunctionBegin; 165827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 1663fdc5746SBarry Smith PetscFunctionReturn(0); 167827bd09bSSatish Balay } 168827bd09bSSatish Balay 169827bd09bSSatish Balay 170827bd09bSSatish Balay 171827bd09bSSatish Balay /**********************************ivec.c************************************** 172827bd09bSSatish Balay Function ivec_c_index() 173827bd09bSSatish Balay 174827bd09bSSatish Balay Input : 175827bd09bSSatish Balay Output: 176827bd09bSSatish Balay Return: 177827bd09bSSatish Balay Description: 178827bd09bSSatish Balay ***********************************ivec.c*************************************/ 179*0924e98cSBarry Smith PetscErrorCode ivec_c_index( int *arg1, int n) 180827bd09bSSatish Balay { 181a501084fSBarry Smith int i=0; 182827bd09bSSatish Balay 1833fdc5746SBarry Smith PetscFunctionBegin; 184827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 1853fdc5746SBarry Smith PetscFunctionReturn(0); 186827bd09bSSatish Balay } 187827bd09bSSatish Balay 188827bd09bSSatish Balay 189827bd09bSSatish Balay 190827bd09bSSatish Balay /**********************************ivec.c************************************** 191827bd09bSSatish Balay Function ivec_fortran_index() 192827bd09bSSatish Balay 193827bd09bSSatish Balay Input : 194827bd09bSSatish Balay Output: 195827bd09bSSatish Balay Return: 196827bd09bSSatish Balay Description: 197827bd09bSSatish Balay ***********************************ivec.c*************************************/ 198*0924e98cSBarry Smith PetscErrorCode ivec_fortran_index( int *arg1, int n) 199827bd09bSSatish Balay { 200a501084fSBarry Smith int i=0; 201827bd09bSSatish Balay 2023fdc5746SBarry Smith PetscFunctionBegin; 203827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 2043fdc5746SBarry Smith PetscFunctionReturn(0); 205827bd09bSSatish Balay } 206827bd09bSSatish Balay 207827bd09bSSatish Balay 208827bd09bSSatish Balay 209827bd09bSSatish Balay /**********************************ivec.c************************************** 210827bd09bSSatish Balay Function ivec_set() 211827bd09bSSatish Balay 212827bd09bSSatish Balay Input : 213827bd09bSSatish Balay Output: 214827bd09bSSatish Balay Return: 215827bd09bSSatish Balay Description: 216827bd09bSSatish Balay ***********************************ivec.c*************************************/ 217*0924e98cSBarry Smith PetscErrorCode ivec_set( int *arg1, int arg2, int n) 218827bd09bSSatish Balay { 2193fdc5746SBarry Smith PetscFunctionBegin; 220827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 2213fdc5746SBarry Smith PetscFunctionReturn(0); 222827bd09bSSatish Balay } 223827bd09bSSatish Balay 224827bd09bSSatish Balay 225827bd09bSSatish Balay 226827bd09bSSatish Balay /**********************************ivec.c************************************** 227827bd09bSSatish Balay Function ivec_cmp() 228827bd09bSSatish Balay 229827bd09bSSatish Balay Input : 230827bd09bSSatish Balay Output: 231827bd09bSSatish Balay Return: 232827bd09bSSatish Balay Description: 233827bd09bSSatish Balay ***********************************ivec.c*************************************/ 234827bd09bSSatish Balay int 235a501084fSBarry Smith ivec_cmp( int *arg1, int *arg2, int n) 236827bd09bSSatish Balay { 2373fdc5746SBarry Smith PetscFunctionBegin; 238827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 239827bd09bSSatish Balay return(TRUE); 240827bd09bSSatish Balay } 241827bd09bSSatish Balay 242827bd09bSSatish Balay 243827bd09bSSatish Balay 244827bd09bSSatish Balay /**********************************ivec.c************************************** 245827bd09bSSatish Balay Function ivec_max() 246827bd09bSSatish Balay 247827bd09bSSatish Balay Input : 248827bd09bSSatish Balay Output: 249827bd09bSSatish Balay Return: 250827bd09bSSatish Balay Description: 251827bd09bSSatish Balay ***********************************ivec.c*************************************/ 252*0924e98cSBarry Smith PetscErrorCode ivec_max( int *arg1, int *arg2, int n) 253827bd09bSSatish Balay { 2543fdc5746SBarry Smith PetscFunctionBegin; 25539945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 2563fdc5746SBarry Smith PetscFunctionReturn(0); 257827bd09bSSatish Balay } 258827bd09bSSatish Balay 259827bd09bSSatish Balay 260827bd09bSSatish Balay 261827bd09bSSatish Balay /**********************************ivec.c************************************** 262827bd09bSSatish Balay Function ivec_min() 263827bd09bSSatish Balay 264827bd09bSSatish Balay Input : 265827bd09bSSatish Balay Output: 266827bd09bSSatish Balay Return: 267827bd09bSSatish Balay Description: 268827bd09bSSatish Balay ***********************************ivec.c*************************************/ 269*0924e98cSBarry Smith PetscErrorCode ivec_min( int *arg1, int *arg2, int n) 270827bd09bSSatish Balay { 2713fdc5746SBarry Smith PetscFunctionBegin; 27239945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 2733fdc5746SBarry Smith PetscFunctionReturn(0); 274827bd09bSSatish Balay } 275827bd09bSSatish Balay 276827bd09bSSatish Balay 277827bd09bSSatish Balay 278827bd09bSSatish Balay /**********************************ivec.c************************************** 279827bd09bSSatish Balay Function ivec_mult() 280827bd09bSSatish Balay 281827bd09bSSatish Balay Input : 282827bd09bSSatish Balay Output: 283827bd09bSSatish Balay Return: 284827bd09bSSatish Balay Description: 285827bd09bSSatish Balay ***********************************ivec.c*************************************/ 286*0924e98cSBarry Smith PetscErrorCode ivec_mult( int *arg1, int *arg2, int n) 287827bd09bSSatish Balay { 2883fdc5746SBarry Smith PetscFunctionBegin; 289827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 2903fdc5746SBarry Smith PetscFunctionReturn(0); 291827bd09bSSatish Balay } 292827bd09bSSatish Balay 293827bd09bSSatish Balay 294827bd09bSSatish Balay 295827bd09bSSatish Balay /**********************************ivec.c************************************** 296827bd09bSSatish Balay Function ivec_add() 297827bd09bSSatish Balay 298827bd09bSSatish Balay Input : 299827bd09bSSatish Balay Output: 300827bd09bSSatish Balay Return: 301827bd09bSSatish Balay Description: 302827bd09bSSatish Balay ***********************************ivec.c*************************************/ 303*0924e98cSBarry Smith PetscErrorCode ivec_add( int *arg1, int *arg2, int n) 304827bd09bSSatish Balay { 3053fdc5746SBarry Smith PetscFunctionBegin; 306827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 3073fdc5746SBarry Smith PetscFunctionReturn(0); 308827bd09bSSatish Balay } 309827bd09bSSatish Balay 310827bd09bSSatish Balay 311827bd09bSSatish Balay 312827bd09bSSatish Balay /**********************************ivec.c************************************** 313827bd09bSSatish Balay Function ivec_lxor() 314827bd09bSSatish Balay 315827bd09bSSatish Balay Input : 316827bd09bSSatish Balay Output: 317827bd09bSSatish Balay Return: 318827bd09bSSatish Balay Description: 319827bd09bSSatish Balay ***********************************ivec.c*************************************/ 320*0924e98cSBarry Smith PetscErrorCode ivec_lxor( int *arg1, int *arg2, int n) 321827bd09bSSatish Balay { 3223fdc5746SBarry Smith PetscFunctionBegin; 323827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 3243fdc5746SBarry Smith PetscFunctionReturn(0); 325827bd09bSSatish Balay } 326827bd09bSSatish Balay 327827bd09bSSatish Balay 328827bd09bSSatish Balay 329827bd09bSSatish Balay /**********************************ivec.c************************************** 330827bd09bSSatish Balay Function ivec_xor() 331827bd09bSSatish Balay 332827bd09bSSatish Balay Input : 333827bd09bSSatish Balay Output: 334827bd09bSSatish Balay Return: 335827bd09bSSatish Balay Description: 336827bd09bSSatish Balay ***********************************ivec.c*************************************/ 337*0924e98cSBarry Smith PetscErrorCode ivec_xor( int *arg1, int *arg2, int n) 338827bd09bSSatish Balay { 3393fdc5746SBarry Smith PetscFunctionBegin; 340827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 3413fdc5746SBarry Smith PetscFunctionReturn(0); 342827bd09bSSatish Balay } 343827bd09bSSatish Balay 344827bd09bSSatish Balay 345827bd09bSSatish Balay 346827bd09bSSatish Balay /**********************************ivec.c************************************** 347827bd09bSSatish Balay Function ivec_or() 348827bd09bSSatish Balay 349827bd09bSSatish Balay Input : 350827bd09bSSatish Balay Output: 351827bd09bSSatish Balay Return: 352827bd09bSSatish Balay Description: 353827bd09bSSatish Balay ***********************************ivec.c*************************************/ 354*0924e98cSBarry Smith PetscErrorCode ivec_or( int *arg1, int *arg2, int n) 355827bd09bSSatish Balay { 3563fdc5746SBarry Smith PetscFunctionBegin; 357827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 3583fdc5746SBarry Smith PetscFunctionReturn(0); 359827bd09bSSatish Balay } 360827bd09bSSatish Balay 361827bd09bSSatish Balay 362827bd09bSSatish Balay 363827bd09bSSatish Balay /**********************************ivec.c************************************** 364827bd09bSSatish Balay Function ivec_lor() 365827bd09bSSatish Balay 366827bd09bSSatish Balay Input : 367827bd09bSSatish Balay Output: 368827bd09bSSatish Balay Return: 369827bd09bSSatish Balay Description: 370827bd09bSSatish Balay ***********************************ivec.c*************************************/ 371*0924e98cSBarry Smith PetscErrorCode ivec_lor( int *arg1, int *arg2, int n) 372827bd09bSSatish Balay { 3733fdc5746SBarry Smith PetscFunctionBegin; 374827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 3753fdc5746SBarry Smith PetscFunctionReturn(0); 376827bd09bSSatish Balay } 377827bd09bSSatish Balay 378827bd09bSSatish Balay 379827bd09bSSatish Balay 380827bd09bSSatish Balay /**********************************ivec.c************************************** 381827bd09bSSatish Balay Function ivec_or3() 382827bd09bSSatish Balay 383827bd09bSSatish Balay Input : 384827bd09bSSatish Balay Output: 385827bd09bSSatish Balay Return: 386827bd09bSSatish Balay Description: 387827bd09bSSatish Balay ***********************************ivec.c*************************************/ 388*0924e98cSBarry Smith PetscErrorCode ivec_or3( int *arg1, int *arg2, int *arg3, 389a501084fSBarry Smith int n) 390827bd09bSSatish Balay { 3913fdc5746SBarry Smith PetscFunctionBegin; 392827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 3933fdc5746SBarry Smith PetscFunctionReturn(0); 394827bd09bSSatish Balay } 395827bd09bSSatish Balay 396827bd09bSSatish Balay 397827bd09bSSatish Balay 398827bd09bSSatish Balay /**********************************ivec.c************************************** 399827bd09bSSatish Balay Function ivec_and() 400827bd09bSSatish Balay 401827bd09bSSatish Balay Input : 402827bd09bSSatish Balay Output: 403827bd09bSSatish Balay Return: 404827bd09bSSatish Balay Description: 405827bd09bSSatish Balay ***********************************ivec.c*************************************/ 406*0924e98cSBarry Smith PetscErrorCode ivec_and( int *arg1, int *arg2, int n) 407827bd09bSSatish Balay { 4083fdc5746SBarry Smith PetscFunctionBegin; 409827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 4103fdc5746SBarry Smith PetscFunctionReturn(0); 411827bd09bSSatish Balay } 412827bd09bSSatish Balay 413827bd09bSSatish Balay 414827bd09bSSatish Balay 415827bd09bSSatish Balay /**********************************ivec.c************************************** 416827bd09bSSatish Balay Function ivec_land() 417827bd09bSSatish Balay 418827bd09bSSatish Balay Input : 419827bd09bSSatish Balay Output: 420827bd09bSSatish Balay Return: 421827bd09bSSatish Balay Description: 422827bd09bSSatish Balay ***********************************ivec.c*************************************/ 423*0924e98cSBarry Smith PetscErrorCode ivec_land( int *arg1, int *arg2, int n) 424827bd09bSSatish Balay { 4253fdc5746SBarry Smith PetscFunctionBegin; 426827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 4273fdc5746SBarry Smith PetscFunctionReturn(0); 428827bd09bSSatish Balay } 429827bd09bSSatish Balay 430827bd09bSSatish Balay 431827bd09bSSatish Balay 432827bd09bSSatish Balay /**********************************ivec.c************************************** 433827bd09bSSatish Balay Function ivec_and3() 434827bd09bSSatish Balay 435827bd09bSSatish Balay Input : 436827bd09bSSatish Balay Output: 437827bd09bSSatish Balay Return: 438827bd09bSSatish Balay Description: 439827bd09bSSatish Balay ***********************************ivec.c*************************************/ 440*0924e98cSBarry Smith PetscErrorCode ivec_and3( int *arg1, int *arg2, int *arg3, int n) 441827bd09bSSatish Balay { 4423fdc5746SBarry Smith PetscFunctionBegin; 443827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 4443fdc5746SBarry Smith PetscFunctionReturn(0); 445827bd09bSSatish Balay } 446827bd09bSSatish Balay 447827bd09bSSatish Balay 448827bd09bSSatish Balay 449827bd09bSSatish Balay /**********************************ivec.c************************************** 450827bd09bSSatish Balay Function ivec_sum 451827bd09bSSatish Balay 452827bd09bSSatish Balay Input : 453827bd09bSSatish Balay Output: 454827bd09bSSatish Balay Return: 455827bd09bSSatish Balay Description: 456827bd09bSSatish Balay ***********************************ivec.c*************************************/ 457a501084fSBarry Smith int ivec_sum( int *arg1, int n) 458827bd09bSSatish Balay { 459a501084fSBarry Smith int tmp = 0; 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_and 470827bd09bSSatish Balay 471827bd09bSSatish Balay Input : 472827bd09bSSatish Balay Output: 473827bd09bSSatish Balay Return: 474827bd09bSSatish Balay Description: 475827bd09bSSatish Balay ***********************************ivec.c*************************************/ 476a501084fSBarry Smith int ivec_reduce_and( int *arg1, int n) 477827bd09bSSatish Balay { 478a501084fSBarry Smith int tmp = ALL_ONES; 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_reduce_or 489827bd09bSSatish Balay 490827bd09bSSatish Balay Input : 491827bd09bSSatish Balay Output: 492827bd09bSSatish Balay Return: 493827bd09bSSatish Balay Description: 494827bd09bSSatish Balay ***********************************ivec.c*************************************/ 495a501084fSBarry Smith int ivec_reduce_or( int *arg1, int n) 496827bd09bSSatish Balay { 497a501084fSBarry Smith int tmp = 0; 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_prod 508827bd09bSSatish Balay 509827bd09bSSatish Balay Input : 510827bd09bSSatish Balay Output: 511827bd09bSSatish Balay Return: 512827bd09bSSatish Balay Description: 513827bd09bSSatish Balay ***********************************ivec.c*************************************/ 514a501084fSBarry Smith int ivec_prod( int *arg1, int n) 515827bd09bSSatish Balay { 516a501084fSBarry Smith int tmp = 1; 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_u_sum 527827bd09bSSatish Balay 528827bd09bSSatish Balay Input : 529827bd09bSSatish Balay Output: 530827bd09bSSatish Balay Return: 531827bd09bSSatish Balay Description: 532827bd09bSSatish Balay ***********************************ivec.c*************************************/ 533a501084fSBarry Smith int ivec_u_sum( unsigned *arg1, int n) 534827bd09bSSatish Balay { 535a501084fSBarry Smith unsigned tmp = 0; 536827bd09bSSatish Balay 537827bd09bSSatish Balay 538827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 539827bd09bSSatish Balay return(tmp); 540827bd09bSSatish Balay } 541827bd09bSSatish Balay 542827bd09bSSatish Balay 543827bd09bSSatish Balay 544827bd09bSSatish Balay /**********************************ivec.c************************************** 545827bd09bSSatish Balay Function ivec_lb() 546827bd09bSSatish Balay 547827bd09bSSatish Balay Input : 548827bd09bSSatish Balay Output: 549827bd09bSSatish Balay Return: 550827bd09bSSatish Balay Description: 551827bd09bSSatish Balay ***********************************ivec.c*************************************/ 552827bd09bSSatish Balay int 553a501084fSBarry Smith ivec_lb( int *arg1, int n) 554827bd09bSSatish Balay { 555a501084fSBarry Smith int min = INT_MAX; 556827bd09bSSatish Balay 557827bd09bSSatish Balay 55839945688SSatish Balay while (n--) {min = PetscMin(min,*arg1); arg1++;} 559827bd09bSSatish Balay return(min); 560827bd09bSSatish Balay } 561827bd09bSSatish Balay 562827bd09bSSatish Balay 563827bd09bSSatish Balay 564827bd09bSSatish Balay /**********************************ivec.c************************************** 565827bd09bSSatish Balay Function ivec_ub() 566827bd09bSSatish Balay 567827bd09bSSatish Balay Input : 568827bd09bSSatish Balay Output: 569827bd09bSSatish Balay Return: 570827bd09bSSatish Balay Description: 571827bd09bSSatish Balay ***********************************ivec.c*************************************/ 572827bd09bSSatish Balay int 573a501084fSBarry Smith ivec_ub( int *arg1, int n) 574827bd09bSSatish Balay { 575a501084fSBarry Smith int max = INT_MIN; 576827bd09bSSatish Balay 577827bd09bSSatish Balay 57839945688SSatish Balay while (n--) {max = PetscMax(max,*arg1); arg1++;} 579827bd09bSSatish Balay return(max); 580827bd09bSSatish Balay } 581827bd09bSSatish Balay 582827bd09bSSatish Balay 583827bd09bSSatish Balay 584827bd09bSSatish Balay /**********************************ivec.c************************************** 585827bd09bSSatish Balay Function split_buf() 586827bd09bSSatish Balay 587827bd09bSSatish Balay Input : 588827bd09bSSatish Balay Output: 589827bd09bSSatish Balay Return: 590827bd09bSSatish Balay Description: 591827bd09bSSatish Balay 592827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 593827bd09bSSatish Balay ***********************************ivec.c*************************************/ 594827bd09bSSatish Balay int 595a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2, int size) 596827bd09bSSatish Balay { 597827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 598827bd09bSSatish Balay return(size); 599827bd09bSSatish Balay } 600827bd09bSSatish Balay 601827bd09bSSatish Balay 602827bd09bSSatish Balay 603827bd09bSSatish Balay /**********************************ivec.c************************************** 604827bd09bSSatish Balay Function ivec_non_uniform() 605827bd09bSSatish Balay 606827bd09bSSatish Balay Input : 607827bd09bSSatish Balay Output: 608827bd09bSSatish Balay Return: 609827bd09bSSatish Balay Description: 610827bd09bSSatish Balay ***********************************ivec.c*************************************/ 611*0924e98cSBarry Smith PetscErrorCode ivec_non_uniform(int *arg1, int *arg2, int n, int *arg3) 612827bd09bSSatish Balay { 613a501084fSBarry Smith int i, j, type; 614827bd09bSSatish Balay 615827bd09bSSatish Balay 6163fdc5746SBarry Smith PetscFunctionBegin; 617827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 618827bd09bSSatish Balay for (i=0;i<n;) 619827bd09bSSatish Balay { 620827bd09bSSatish Balay /* clump 'em for now */ 621827bd09bSSatish Balay j=i+1; 622827bd09bSSatish Balay type = arg3[i]; 623827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 624827bd09bSSatish Balay {j++;} 625827bd09bSSatish Balay 626827bd09bSSatish Balay /* how many together */ 627827bd09bSSatish Balay j -= i; 628827bd09bSSatish Balay 629827bd09bSSatish Balay /* call appropriate ivec function */ 630827bd09bSSatish Balay if (type == GL_MAX) 631827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 632827bd09bSSatish Balay else if (type == GL_MIN) 633827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 634827bd09bSSatish Balay else if (type == GL_MULT) 635827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 636827bd09bSSatish Balay else if (type == GL_ADD) 637827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 638827bd09bSSatish Balay else if (type == GL_B_XOR) 639827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 640827bd09bSSatish Balay else if (type == GL_B_OR) 641827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 642827bd09bSSatish Balay else if (type == GL_B_AND) 643827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 644827bd09bSSatish Balay else if (type == GL_L_XOR) 645827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 646827bd09bSSatish Balay else if (type == GL_L_OR) 647827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 648827bd09bSSatish Balay else if (type == GL_L_AND) 649827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 650827bd09bSSatish Balay else 651827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 652827bd09bSSatish Balay 653827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 654827bd09bSSatish Balay } 6553fdc5746SBarry Smith PetscFunctionReturn(0); 656827bd09bSSatish Balay } 657827bd09bSSatish Balay 658827bd09bSSatish Balay 659827bd09bSSatish Balay 660827bd09bSSatish Balay /**********************************ivec.c************************************** 661827bd09bSSatish Balay Function ivec_addr() 662827bd09bSSatish Balay 663827bd09bSSatish Balay Input : 664827bd09bSSatish Balay Output: 665827bd09bSSatish Balay Return: 666827bd09bSSatish Balay Description: 667827bd09bSSatish Balay ***********************************ivec.c*************************************/ 668a501084fSBarry Smith vfp ivec_fct_addr( int type) 669827bd09bSSatish Balay { 6703fdc5746SBarry Smith PetscFunctionBegin; 671827bd09bSSatish Balay if (type == NON_UNIFORM) 6723fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);} 673827bd09bSSatish Balay else if (type == GL_MAX) 6743fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);} 675827bd09bSSatish Balay else if (type == GL_MIN) 6763fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);} 677827bd09bSSatish Balay else if (type == GL_MULT) 6783fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);} 679827bd09bSSatish Balay else if (type == GL_ADD) 6803fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);} 681827bd09bSSatish Balay else if (type == GL_B_XOR) 6823fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);} 683827bd09bSSatish Balay else if (type == GL_B_OR) 6843fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);} 685827bd09bSSatish Balay else if (type == GL_B_AND) 6863fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);} 687827bd09bSSatish Balay else if (type == GL_L_XOR) 6883fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);} 689827bd09bSSatish Balay else if (type == GL_L_OR) 6903fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);} 691827bd09bSSatish Balay else if (type == GL_L_AND) 6923fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);} 693827bd09bSSatish Balay 694827bd09bSSatish Balay /* catch all ... not good if we get here */ 695827bd09bSSatish Balay return(NULL); 696827bd09bSSatish Balay } 697827bd09bSSatish Balay 698827bd09bSSatish Balay 699827bd09bSSatish Balay /**********************************ivec.c************************************** 700827bd09bSSatish Balay Function ct_bits() 701827bd09bSSatish Balay 702827bd09bSSatish Balay Input : 703827bd09bSSatish Balay Output: 704827bd09bSSatish Balay Return: 705827bd09bSSatish Balay Description: MUST FIX THIS!!! 706827bd09bSSatish Balay ***********************************ivec.c*************************************/ 707827bd09bSSatish Balay #if defined(notusing) 708827bd09bSSatish Balay static 709827bd09bSSatish Balay int 710a501084fSBarry Smith ivec_ct_bits( int *ptr, int n) 711827bd09bSSatish Balay { 712a501084fSBarry Smith int tmp=0; 713827bd09bSSatish Balay 714827bd09bSSatish Balay 715827bd09bSSatish Balay /* should expand to full 32 bit */ 716827bd09bSSatish Balay while (n--) 717827bd09bSSatish Balay { 718827bd09bSSatish Balay if (*ptr&128) {tmp++;} 719827bd09bSSatish Balay if (*ptr&64) {tmp++;} 720827bd09bSSatish Balay if (*ptr&32) {tmp++;} 721827bd09bSSatish Balay if (*ptr&16) {tmp++;} 722827bd09bSSatish Balay if (*ptr&8) {tmp++;} 723827bd09bSSatish Balay if (*ptr&4) {tmp++;} 724827bd09bSSatish Balay if (*ptr&2) {tmp++;} 725827bd09bSSatish Balay if (*ptr&1) {tmp++;} 726827bd09bSSatish Balay ptr++; 727827bd09bSSatish Balay } 728827bd09bSSatish Balay 729827bd09bSSatish Balay return(tmp); 730827bd09bSSatish Balay } 731827bd09bSSatish Balay #endif 732827bd09bSSatish Balay 733827bd09bSSatish Balay 734827bd09bSSatish Balay /****************************************************************************** 735827bd09bSSatish Balay Function: ivec_sort(). 736827bd09bSSatish Balay 737827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 738827bd09bSSatish Balay Output: sorted list (in ascending order). 739827bd09bSSatish Balay Return: none. 740827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 741827bd09bSSatish Balay ******************************************************************************/ 742*0924e98cSBarry Smith PetscErrorCode ivec_sort( int *ar, int size) 743827bd09bSSatish Balay { 744a501084fSBarry Smith int *pi, *pj, temp; 745a501084fSBarry Smith int **top_a = (int **) offset_stack; 746a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 747827bd09bSSatish Balay 748827bd09bSSatish Balay 749827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 750827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 751827bd09bSSatish Balay size--; 752827bd09bSSatish Balay 753827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 754827bd09bSSatish Balay for (;;) 755827bd09bSSatish Balay { 756827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 757827bd09bSSatish Balay if (size > SORT_OPT) 758827bd09bSSatish Balay { 759827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 760827bd09bSSatish Balay pi = ar+1; 761827bd09bSSatish Balay pj = ar+size; 762827bd09bSSatish Balay 763827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 764827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 765827bd09bSSatish Balay 766827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 767827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 768827bd09bSSatish Balay if (*pi > *pj) 769827bd09bSSatish Balay {SWAP(*pi,*pj)} 770827bd09bSSatish Balay if (*ar > *pj) 771827bd09bSSatish Balay {SWAP(*ar,*pj)} 772827bd09bSSatish Balay else if (*pi > *ar) 773827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 774827bd09bSSatish Balay 775827bd09bSSatish Balay /* partition about pivot_value ... */ 776827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 777827bd09bSSatish Balay for(;;) 778827bd09bSSatish Balay { 779827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 780827bd09bSSatish Balay do pi++; while (*pi<*ar); 781827bd09bSSatish Balay do pj--; while (*pj>*ar); 782827bd09bSSatish Balay 783827bd09bSSatish Balay /* if we've crossed we're done */ 784827bd09bSSatish Balay if (pj<pi) break; 785827bd09bSSatish Balay 786827bd09bSSatish Balay /* else swap */ 787827bd09bSSatish Balay SWAP(*pi,*pj) 788827bd09bSSatish Balay } 789827bd09bSSatish Balay 790827bd09bSSatish Balay /* place pivot_value in it's correct location */ 791827bd09bSSatish Balay SWAP(*ar,*pj) 792827bd09bSSatish Balay 793827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 794827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 795827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 796827bd09bSSatish Balay 797827bd09bSSatish Balay /* push right hand child iff length > 1 */ 798827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 799827bd09bSSatish Balay { 800827bd09bSSatish Balay *(top_a++) = pi; 801827bd09bSSatish Balay size -= *top_s+2; 802827bd09bSSatish Balay top_s++; 803827bd09bSSatish Balay } 804827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 805827bd09bSSatish Balay else if (size -= *top_s+2) 806827bd09bSSatish Balay {;} 807827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 808827bd09bSSatish Balay else 809827bd09bSSatish Balay { 810827bd09bSSatish Balay ar = *(--top_a); 811827bd09bSSatish Balay size = *(--top_s); 812827bd09bSSatish Balay } 813827bd09bSSatish Balay } 814827bd09bSSatish Balay 815827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 816827bd09bSSatish Balay else 817827bd09bSSatish Balay { 818827bd09bSSatish Balay /* insertion sort for bottom */ 819827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 820827bd09bSSatish Balay { 821827bd09bSSatish Balay temp = *pj; 822827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 823827bd09bSSatish Balay { 824827bd09bSSatish Balay if (*pi <= temp) break; 825827bd09bSSatish Balay *(pi+1)=*pi; 826827bd09bSSatish Balay } 827827bd09bSSatish Balay *(pi+1)=temp; 828827bd09bSSatish Balay } 829827bd09bSSatish Balay 830827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 8313fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 832827bd09bSSatish Balay 833827bd09bSSatish Balay /* else pop another list from the stack */ 834827bd09bSSatish Balay ar = *(--top_a); 835827bd09bSSatish Balay size = *(--top_s); 836827bd09bSSatish Balay } 837827bd09bSSatish Balay } 8383fdc5746SBarry Smith PetscFunctionReturn(0); 839827bd09bSSatish Balay } 840827bd09bSSatish Balay 841827bd09bSSatish Balay 842827bd09bSSatish Balay 843827bd09bSSatish Balay /****************************************************************************** 844827bd09bSSatish Balay Function: ivec_sort_companion(). 845827bd09bSSatish Balay 846827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 847827bd09bSSatish Balay Output: sorted list (in ascending order). 848827bd09bSSatish Balay Return: none. 849827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 850827bd09bSSatish Balay ******************************************************************************/ 851*0924e98cSBarry Smith PetscErrorCode ivec_sort_companion( int *ar, int *ar2, int size) 852827bd09bSSatish Balay { 853a501084fSBarry Smith int *pi, *pj, temp, temp2; 854a501084fSBarry Smith int **top_a = (int **)offset_stack; 855a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 856a501084fSBarry Smith int *pi2, *pj2; 857a501084fSBarry Smith int mid; 858827bd09bSSatish Balay 8593fdc5746SBarry Smith PetscFunctionBegin; 860827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 861827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 862827bd09bSSatish Balay size--; 863827bd09bSSatish Balay 864827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 865827bd09bSSatish Balay for (;;) 866827bd09bSSatish Balay { 867827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 868827bd09bSSatish Balay if (size > SORT_OPT) 869827bd09bSSatish Balay { 870827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 871827bd09bSSatish Balay mid = size>>1; 872827bd09bSSatish Balay pi = ar+1; 873827bd09bSSatish Balay pj = ar+mid; 874827bd09bSSatish Balay pi2 = ar2+1; 875827bd09bSSatish Balay pj2 = ar2+mid; 876827bd09bSSatish Balay 877827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 878827bd09bSSatish Balay SWAP(*pi,*pj) 879827bd09bSSatish Balay SWAP(*pi2,*pj2) 880827bd09bSSatish Balay 881827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 882827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 883827bd09bSSatish Balay pj = ar+size; 884827bd09bSSatish Balay pj2 = ar2+size; 885827bd09bSSatish Balay if (*pi > *pj) 886827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 887827bd09bSSatish Balay if (*ar > *pj) 888827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 889827bd09bSSatish Balay else if (*pi > *ar) 890827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 891827bd09bSSatish Balay 892827bd09bSSatish Balay /* partition about pivot_value ... */ 893827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 894827bd09bSSatish Balay for(;;) 895827bd09bSSatish Balay { 896827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 897827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 898827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 899827bd09bSSatish Balay 900827bd09bSSatish Balay /* if we've crossed we're done */ 901827bd09bSSatish Balay if (pj<pi) break; 902827bd09bSSatish Balay 903827bd09bSSatish Balay /* else swap */ 904827bd09bSSatish Balay SWAP(*pi,*pj) 905827bd09bSSatish Balay SWAP(*pi2,*pj2) 906827bd09bSSatish Balay } 907827bd09bSSatish Balay 908827bd09bSSatish Balay /* place pivot_value in it's correct location */ 909827bd09bSSatish Balay SWAP(*ar,*pj) 910827bd09bSSatish Balay SWAP(*ar2,*pj2) 911827bd09bSSatish Balay 912827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 913827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 914827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 915827bd09bSSatish Balay 916827bd09bSSatish Balay /* push right hand child iff length > 1 */ 917827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 918827bd09bSSatish Balay { 919827bd09bSSatish Balay *(top_a++) = pi; 920827bd09bSSatish Balay *(top_a++) = pi2; 921827bd09bSSatish Balay size -= *top_s+2; 922827bd09bSSatish Balay top_s++; 923827bd09bSSatish Balay } 924827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 925827bd09bSSatish Balay else if (size -= *top_s+2) 926827bd09bSSatish Balay {;} 927827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 928827bd09bSSatish Balay else 929827bd09bSSatish Balay { 930827bd09bSSatish Balay ar2 = *(--top_a); 931827bd09bSSatish Balay ar = *(--top_a); 932827bd09bSSatish Balay size = *(--top_s); 933827bd09bSSatish Balay } 934827bd09bSSatish Balay } 935827bd09bSSatish Balay 936827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 937827bd09bSSatish Balay else 938827bd09bSSatish Balay { 939827bd09bSSatish Balay /* insertion sort for bottom */ 940827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 941827bd09bSSatish Balay { 942827bd09bSSatish Balay temp = *pj; 943827bd09bSSatish Balay temp2 = *pj2; 944827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 945827bd09bSSatish Balay { 946827bd09bSSatish Balay if (*pi <= temp) break; 947827bd09bSSatish Balay *(pi+1)=*pi; 948827bd09bSSatish Balay *(pi2+1)=*pi2; 949827bd09bSSatish Balay } 950827bd09bSSatish Balay *(pi+1)=temp; 951827bd09bSSatish Balay *(pi2+1)=temp2; 952827bd09bSSatish Balay } 953827bd09bSSatish Balay 954827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 9553fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 956827bd09bSSatish Balay 957827bd09bSSatish Balay /* else pop another list from the stack */ 958827bd09bSSatish Balay ar2 = *(--top_a); 959827bd09bSSatish Balay ar = *(--top_a); 960827bd09bSSatish Balay size = *(--top_s); 961827bd09bSSatish Balay } 962827bd09bSSatish Balay } 9633fdc5746SBarry Smith PetscFunctionReturn(0); 964827bd09bSSatish Balay } 965827bd09bSSatish Balay 966827bd09bSSatish Balay 967827bd09bSSatish Balay 968827bd09bSSatish Balay /****************************************************************************** 969827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 970827bd09bSSatish Balay 971827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 972827bd09bSSatish Balay Output: sorted list (in ascending order). 973827bd09bSSatish Balay Return: none. 974827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 975827bd09bSSatish Balay ******************************************************************************/ 976*0924e98cSBarry Smith PetscErrorCode ivec_sort_companion_hack( int *ar, int **ar2, 977a501084fSBarry Smith int size) 978827bd09bSSatish Balay { 979a501084fSBarry Smith int *pi, *pj, temp, *ptr; 980a501084fSBarry Smith int **top_a = (int **)offset_stack; 981a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 982a501084fSBarry Smith int **pi2, **pj2; 983a501084fSBarry Smith int mid; 984827bd09bSSatish Balay 9853fdc5746SBarry Smith PetscFunctionBegin; 986827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 987827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 988827bd09bSSatish Balay size--; 989827bd09bSSatish Balay 990827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 991827bd09bSSatish Balay for (;;) 992827bd09bSSatish Balay { 993827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 994827bd09bSSatish Balay if (size > SORT_OPT) 995827bd09bSSatish Balay { 996827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 997827bd09bSSatish Balay mid = size>>1; 998827bd09bSSatish Balay pi = ar+1; 999827bd09bSSatish Balay pj = ar+mid; 1000827bd09bSSatish Balay pi2 = ar2+1; 1001827bd09bSSatish Balay pj2 = ar2+mid; 1002827bd09bSSatish Balay 1003827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1004827bd09bSSatish Balay SWAP(*pi,*pj) 1005827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1006827bd09bSSatish Balay 1007827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1008827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1009827bd09bSSatish Balay pj = ar+size; 1010827bd09bSSatish Balay pj2 = ar2+size; 1011827bd09bSSatish Balay if (*pi > *pj) 1012827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1013827bd09bSSatish Balay if (*ar > *pj) 1014827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1015827bd09bSSatish Balay else if (*pi > *ar) 1016827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1017827bd09bSSatish Balay 1018827bd09bSSatish Balay /* partition about pivot_value ... */ 1019827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1020827bd09bSSatish Balay for(;;) 1021827bd09bSSatish Balay { 1022827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1023827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1024827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1025827bd09bSSatish Balay 1026827bd09bSSatish Balay /* if we've crossed we're done */ 1027827bd09bSSatish Balay if (pj<pi) break; 1028827bd09bSSatish Balay 1029827bd09bSSatish Balay /* else swap */ 1030827bd09bSSatish Balay SWAP(*pi,*pj) 1031827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1032827bd09bSSatish Balay } 1033827bd09bSSatish Balay 1034827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1035827bd09bSSatish Balay SWAP(*ar,*pj) 1036827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1037827bd09bSSatish Balay 1038827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1039827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1040827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1041827bd09bSSatish Balay 1042827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1043827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1044827bd09bSSatish Balay { 1045827bd09bSSatish Balay *(top_a++) = pi; 1046827bd09bSSatish Balay *(top_a++) = (int*) pi2; 1047827bd09bSSatish Balay size -= *top_s+2; 1048827bd09bSSatish Balay top_s++; 1049827bd09bSSatish Balay } 1050827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1051827bd09bSSatish Balay else if (size -= *top_s+2) 1052827bd09bSSatish Balay {;} 1053827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1054827bd09bSSatish Balay else 1055827bd09bSSatish Balay { 1056827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1057827bd09bSSatish Balay ar = *(--top_a); 1058827bd09bSSatish Balay size = *(--top_s); 1059827bd09bSSatish Balay } 1060827bd09bSSatish Balay } 1061827bd09bSSatish Balay 1062827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1063827bd09bSSatish Balay else 1064827bd09bSSatish Balay { 1065827bd09bSSatish Balay /* insertion sort for bottom */ 1066827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1067827bd09bSSatish Balay { 1068827bd09bSSatish Balay temp = *pj; 1069827bd09bSSatish Balay ptr = *pj2; 1070827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1071827bd09bSSatish Balay { 1072827bd09bSSatish Balay if (*pi <= temp) break; 1073827bd09bSSatish Balay *(pi+1)=*pi; 1074827bd09bSSatish Balay *(pi2+1)=*pi2; 1075827bd09bSSatish Balay } 1076827bd09bSSatish Balay *(pi+1)=temp; 1077827bd09bSSatish Balay *(pi2+1)=ptr; 1078827bd09bSSatish Balay } 1079827bd09bSSatish Balay 1080827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 10813fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1082827bd09bSSatish Balay 1083827bd09bSSatish Balay /* else pop another list from the stack */ 1084827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1085827bd09bSSatish Balay ar = *(--top_a); 1086827bd09bSSatish Balay size = *(--top_s); 1087827bd09bSSatish Balay } 1088827bd09bSSatish Balay } 10893fdc5746SBarry Smith PetscFunctionReturn(0); 1090827bd09bSSatish Balay } 1091827bd09bSSatish Balay 1092827bd09bSSatish Balay 1093827bd09bSSatish Balay 1094827bd09bSSatish Balay /****************************************************************************** 1095827bd09bSSatish Balay Function: SMI_sort(). 1096827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1097827bd09bSSatish Balay Output: sorted list (in ascending order). 1098827bd09bSSatish Balay Return: none. 1099827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1100827bd09bSSatish Balay ******************************************************************************/ 1101*0924e98cSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, int size, int type) 1102827bd09bSSatish Balay { 11033fdc5746SBarry Smith PetscFunctionBegin; 1104827bd09bSSatish Balay if (type == SORT_INTEGER) 1105827bd09bSSatish Balay { 1106827bd09bSSatish Balay if (ar2) 1107827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 1108827bd09bSSatish Balay else 1109827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1110827bd09bSSatish Balay } 1111827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1112827bd09bSSatish Balay { 1113827bd09bSSatish Balay if (ar2) 1114827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 1115827bd09bSSatish Balay else 1116827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1117827bd09bSSatish Balay } 1118827bd09bSSatish Balay 1119827bd09bSSatish Balay else 1120827bd09bSSatish Balay { 1121827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1122827bd09bSSatish Balay } 11233fdc5746SBarry Smith PetscFunctionReturn(0); 1124827bd09bSSatish Balay } 1125827bd09bSSatish Balay 1126827bd09bSSatish Balay 1127827bd09bSSatish Balay 1128827bd09bSSatish Balay /**********************************ivec.c************************************** 1129827bd09bSSatish Balay Function ivec_linear_search() 1130827bd09bSSatish Balay 1131827bd09bSSatish Balay Input : 1132827bd09bSSatish Balay Output: 1133827bd09bSSatish Balay Return: 1134827bd09bSSatish Balay Description: 1135827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1136827bd09bSSatish Balay int 1137a501084fSBarry Smith ivec_linear_search( int item, int *list, int n) 1138827bd09bSSatish Balay { 1139a501084fSBarry Smith int tmp = n-1; 11403fdc5746SBarry Smith PetscFunctionBegin; 1141827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1142827bd09bSSatish Balay return(-1); 1143827bd09bSSatish Balay } 1144827bd09bSSatish Balay 1145827bd09bSSatish Balay 1146827bd09bSSatish Balay 1147827bd09bSSatish Balay /**********************************ivec.c************************************** 1148827bd09bSSatish Balay Function ivec_binary_search() 1149827bd09bSSatish Balay 1150827bd09bSSatish Balay Input : 1151827bd09bSSatish Balay Output: 1152827bd09bSSatish Balay Return: 1153827bd09bSSatish Balay Description: 1154827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1155827bd09bSSatish Balay int 1156a501084fSBarry Smith ivec_binary_search( int item, int *list, int rh) 1157827bd09bSSatish Balay { 1158a501084fSBarry Smith int mid, lh=0; 1159827bd09bSSatish Balay 1160827bd09bSSatish Balay rh--; 1161827bd09bSSatish Balay while (lh<=rh) 1162827bd09bSSatish Balay { 1163827bd09bSSatish Balay mid = (lh+rh)>>1; 1164827bd09bSSatish Balay if (*(list+mid) == item) 1165827bd09bSSatish Balay {return(mid);} 1166827bd09bSSatish Balay if (*(list+mid) > item) 1167827bd09bSSatish Balay {rh = mid-1;} 1168827bd09bSSatish Balay else 1169827bd09bSSatish Balay {lh = mid+1;} 1170827bd09bSSatish Balay } 1171827bd09bSSatish Balay return(-1); 1172827bd09bSSatish Balay } 1173827bd09bSSatish Balay 1174827bd09bSSatish Balay 1175827bd09bSSatish Balay 1176827bd09bSSatish Balay /**********************************ivec.c************************************** 1177827bd09bSSatish Balay Function rvec_dump 1178827bd09bSSatish Balay 1179827bd09bSSatish Balay Input : 1180827bd09bSSatish Balay Output: 1181827bd09bSSatish Balay Return: 1182827bd09bSSatish Balay Description: 1183827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1184*0924e98cSBarry Smith PetscErrorCode rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s) 1185827bd09bSSatish Balay { 1186827bd09bSSatish Balay int i; 11873fdc5746SBarry Smith PetscFunctionBegin; 1188827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1189827bd09bSSatish Balay for (i=0;i<n;i++) 1190827bd09bSSatish Balay {printf("%f ",v[i]);} 1191827bd09bSSatish Balay printf("\n"); 1192827bd09bSSatish Balay fflush(stdout); 11933fdc5746SBarry Smith PetscFunctionReturn(0); 1194827bd09bSSatish Balay } 1195827bd09bSSatish Balay 1196827bd09bSSatish Balay 1197827bd09bSSatish Balay 1198827bd09bSSatish Balay /**********************************ivec.c************************************** 1199827bd09bSSatish Balay Function rvec_lb_ub() 1200827bd09bSSatish Balay 1201827bd09bSSatish Balay Input : 1202827bd09bSSatish Balay Output: 1203827bd09bSSatish Balay Return: 1204827bd09bSSatish Balay Description: 1205827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1206*0924e98cSBarry Smith PetscErrorCode rvec_lb_ub( PetscScalar *arg1, int n, PetscScalar *lb, PetscScalar *ub) 1207827bd09bSSatish Balay { 1208a501084fSBarry Smith PetscScalar min = REAL_MAX; 1209a501084fSBarry Smith PetscScalar max = -REAL_MAX; 1210827bd09bSSatish Balay 12113fdc5746SBarry Smith PetscFunctionBegin; 1212827bd09bSSatish Balay while (n--) 1213827bd09bSSatish Balay { 121439945688SSatish Balay min = PetscMin(min,*arg1); 121539945688SSatish Balay max = PetscMax(max,*arg1); 1216827bd09bSSatish Balay arg1++; 1217827bd09bSSatish Balay } 1218827bd09bSSatish Balay 1219827bd09bSSatish Balay *lb=min; 1220827bd09bSSatish Balay *ub=max; 12213fdc5746SBarry Smith PetscFunctionReturn(0); 1222827bd09bSSatish Balay } 1223827bd09bSSatish Balay 1224827bd09bSSatish Balay 1225827bd09bSSatish Balay 1226827bd09bSSatish Balay /********************************ivec.c************************************** 1227827bd09bSSatish Balay Function rvec_copy() 1228827bd09bSSatish Balay 1229827bd09bSSatish Balay Input : 1230827bd09bSSatish Balay Output: 1231827bd09bSSatish Balay Return: 1232827bd09bSSatish Balay Description: 1233827bd09bSSatish Balay *********************************ivec.c*************************************/ 1234*0924e98cSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1, PetscScalar *arg2, int n) 1235827bd09bSSatish Balay { 12363fdc5746SBarry Smith PetscFunctionBegin; 1237827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 12383fdc5746SBarry Smith PetscFunctionReturn(0); 1239827bd09bSSatish Balay } 1240827bd09bSSatish Balay 1241827bd09bSSatish Balay 1242827bd09bSSatish Balay 1243827bd09bSSatish Balay /********************************ivec.c************************************** 1244827bd09bSSatish Balay Function rvec_zero() 1245827bd09bSSatish Balay 1246827bd09bSSatish Balay Input : 1247827bd09bSSatish Balay Output: 1248827bd09bSSatish Balay Return: 1249827bd09bSSatish Balay Description: 1250827bd09bSSatish Balay *********************************ivec.c*************************************/ 1251*0924e98cSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1, int n) 1252827bd09bSSatish Balay { 12533fdc5746SBarry Smith PetscFunctionBegin; 1254827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 12553fdc5746SBarry Smith PetscFunctionReturn(0); 1256827bd09bSSatish Balay } 1257827bd09bSSatish Balay 1258827bd09bSSatish Balay 1259827bd09bSSatish Balay 1260827bd09bSSatish Balay /**********************************ivec.c************************************** 1261827bd09bSSatish Balay Function rvec_one() 1262827bd09bSSatish Balay 1263827bd09bSSatish Balay Input : 1264827bd09bSSatish Balay Output: 1265827bd09bSSatish Balay Return: 1266827bd09bSSatish Balay Description: 1267827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1268*0924e98cSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1, int n) 1269827bd09bSSatish Balay { 12703fdc5746SBarry Smith PetscFunctionBegin; 1271827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 12723fdc5746SBarry Smith PetscFunctionReturn(0); 1273827bd09bSSatish Balay } 1274827bd09bSSatish Balay 1275827bd09bSSatish Balay 1276827bd09bSSatish Balay 1277827bd09bSSatish Balay /**********************************ivec.c************************************** 1278827bd09bSSatish Balay Function rvec_neg_one() 1279827bd09bSSatish Balay 1280827bd09bSSatish Balay Input : 1281827bd09bSSatish Balay Output: 1282827bd09bSSatish Balay Return: 1283827bd09bSSatish Balay Description: 1284827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1285*0924e98cSBarry Smith PetscErrorCode rvec_neg_one( PetscScalar *arg1, int n) 1286827bd09bSSatish Balay { 12873fdc5746SBarry Smith PetscFunctionBegin; 1288827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 12893fdc5746SBarry Smith PetscFunctionReturn(0); 1290827bd09bSSatish Balay } 1291827bd09bSSatish Balay 1292827bd09bSSatish Balay 1293827bd09bSSatish Balay 1294827bd09bSSatish Balay /**********************************ivec.c************************************** 1295827bd09bSSatish Balay Function rvec_set() 1296827bd09bSSatish Balay 1297827bd09bSSatish Balay Input : 1298827bd09bSSatish Balay Output: 1299827bd09bSSatish Balay Return: 1300827bd09bSSatish Balay Description: 1301827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1302*0924e98cSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1, PetscScalar arg2, int n) 1303827bd09bSSatish Balay { 13043fdc5746SBarry Smith PetscFunctionBegin; 1305827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 13063fdc5746SBarry Smith PetscFunctionReturn(0); 1307827bd09bSSatish Balay } 1308827bd09bSSatish Balay 1309827bd09bSSatish Balay 1310827bd09bSSatish Balay 1311827bd09bSSatish Balay /**********************************ivec.c************************************** 1312827bd09bSSatish Balay Function rvec_scale() 1313827bd09bSSatish Balay 1314827bd09bSSatish Balay Input : 1315827bd09bSSatish Balay Output: 1316827bd09bSSatish Balay Return: 1317827bd09bSSatish Balay Description: 1318827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1319*0924e98cSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1, PetscScalar arg2, int n) 1320827bd09bSSatish Balay { 13213fdc5746SBarry Smith PetscFunctionBegin; 1322827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 13233fdc5746SBarry Smith PetscFunctionReturn(0); 1324827bd09bSSatish Balay } 1325827bd09bSSatish Balay 1326827bd09bSSatish Balay 1327827bd09bSSatish Balay 1328827bd09bSSatish Balay /********************************ivec.c************************************** 1329827bd09bSSatish Balay Function rvec_add() 1330827bd09bSSatish Balay 1331827bd09bSSatish Balay Input : 1332827bd09bSSatish Balay Output: 1333827bd09bSSatish Balay Return: 1334827bd09bSSatish Balay Description: 1335827bd09bSSatish Balay *********************************ivec.c*************************************/ 1336*0924e98cSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1, PetscScalar *arg2, int n) 1337827bd09bSSatish Balay { 13383fdc5746SBarry Smith PetscFunctionBegin; 1339827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 13403fdc5746SBarry Smith PetscFunctionReturn(0); 1341827bd09bSSatish Balay } 1342827bd09bSSatish Balay 1343827bd09bSSatish Balay 1344827bd09bSSatish Balay 1345827bd09bSSatish Balay /********************************ivec.c************************************** 1346827bd09bSSatish Balay Function rvec_dot() 1347827bd09bSSatish Balay 1348827bd09bSSatish Balay Input : 1349827bd09bSSatish Balay Output: 1350827bd09bSSatish Balay Return: 1351827bd09bSSatish Balay Description: 1352827bd09bSSatish Balay *********************************ivec.c*************************************/ 1353a501084fSBarry Smith PetscScalar 1354a501084fSBarry Smith rvec_dot( PetscScalar *arg1, PetscScalar *arg2, int n) 1355827bd09bSSatish Balay { 1356a501084fSBarry Smith PetscScalar dot=0.0; 1357827bd09bSSatish Balay 1358827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1359827bd09bSSatish Balay 1360827bd09bSSatish Balay return(dot); 1361827bd09bSSatish Balay } 1362827bd09bSSatish Balay 1363827bd09bSSatish Balay 1364827bd09bSSatish Balay 1365827bd09bSSatish Balay /********************************ivec.c************************************** 1366827bd09bSSatish Balay Function rvec_axpy() 1367827bd09bSSatish Balay 1368827bd09bSSatish Balay Input : 1369827bd09bSSatish Balay Output: 1370827bd09bSSatish Balay Return: 1371827bd09bSSatish Balay Description: 1372827bd09bSSatish Balay *********************************ivec.c*************************************/ 1373*0924e98cSBarry Smith PetscErrorCode rvec_axpy( PetscScalar *arg1, PetscScalar *arg2, PetscScalar scale, 1374a501084fSBarry Smith int n) 1375827bd09bSSatish Balay { 13763fdc5746SBarry Smith PetscFunctionBegin; 1377827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 13783fdc5746SBarry Smith PetscFunctionReturn(0); 1379827bd09bSSatish Balay } 1380827bd09bSSatish Balay 1381827bd09bSSatish Balay 1382827bd09bSSatish Balay /********************************ivec.c************************************** 1383827bd09bSSatish Balay Function rvec_mult() 1384827bd09bSSatish Balay 1385827bd09bSSatish Balay Input : 1386827bd09bSSatish Balay Output: 1387827bd09bSSatish Balay Return: 1388827bd09bSSatish Balay Description: 1389827bd09bSSatish Balay *********************************ivec.c*************************************/ 1390*0924e98cSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1, PetscScalar *arg2, int n) 1391827bd09bSSatish Balay { 13923fdc5746SBarry Smith PetscFunctionBegin; 1393827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 13943fdc5746SBarry Smith PetscFunctionReturn(0); 1395827bd09bSSatish Balay } 1396827bd09bSSatish Balay 1397827bd09bSSatish Balay 1398827bd09bSSatish Balay 1399827bd09bSSatish Balay /********************************ivec.c************************************** 1400827bd09bSSatish Balay Function rvec_max() 1401827bd09bSSatish Balay 1402827bd09bSSatish Balay Input : 1403827bd09bSSatish Balay Output: 1404827bd09bSSatish Balay Return: 1405827bd09bSSatish Balay Description: 1406827bd09bSSatish Balay *********************************ivec.c*************************************/ 1407*0924e98cSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1, PetscScalar *arg2, int n) 1408827bd09bSSatish Balay { 14093fdc5746SBarry Smith PetscFunctionBegin; 141039945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 14113fdc5746SBarry Smith PetscFunctionReturn(0); 1412827bd09bSSatish Balay } 1413827bd09bSSatish Balay 1414827bd09bSSatish Balay 1415827bd09bSSatish Balay 1416827bd09bSSatish Balay /********************************ivec.c************************************** 1417827bd09bSSatish Balay Function rvec_max_abs() 1418827bd09bSSatish Balay 1419827bd09bSSatish Balay Input : 1420827bd09bSSatish Balay Output: 1421827bd09bSSatish Balay Return: 1422827bd09bSSatish Balay Description: 1423827bd09bSSatish Balay *********************************ivec.c*************************************/ 1424*0924e98cSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1425827bd09bSSatish Balay { 14263fdc5746SBarry Smith PetscFunctionBegin; 1427827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 14283fdc5746SBarry Smith PetscFunctionReturn(0); 1429827bd09bSSatish Balay } 1430827bd09bSSatish Balay 1431827bd09bSSatish Balay 1432827bd09bSSatish Balay 1433827bd09bSSatish Balay /********************************ivec.c************************************** 1434827bd09bSSatish Balay Function rvec_min() 1435827bd09bSSatish Balay 1436827bd09bSSatish Balay Input : 1437827bd09bSSatish Balay Output: 1438827bd09bSSatish Balay Return: 1439827bd09bSSatish Balay Description: 1440827bd09bSSatish Balay *********************************ivec.c*************************************/ 1441*0924e98cSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1, PetscScalar *arg2, int n) 1442827bd09bSSatish Balay { 14433fdc5746SBarry Smith PetscFunctionBegin; 144439945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 14453fdc5746SBarry Smith PetscFunctionReturn(0); 1446827bd09bSSatish Balay } 1447827bd09bSSatish Balay 1448827bd09bSSatish Balay 1449827bd09bSSatish Balay 1450827bd09bSSatish Balay /********************************ivec.c************************************** 1451827bd09bSSatish Balay Function rvec_min_abs() 1452827bd09bSSatish Balay 1453827bd09bSSatish Balay Input : 1454827bd09bSSatish Balay Output: 1455827bd09bSSatish Balay Return: 1456827bd09bSSatish Balay Description: 1457827bd09bSSatish Balay *********************************ivec.c*************************************/ 1458*0924e98cSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 1459827bd09bSSatish Balay { 14603fdc5746SBarry Smith PetscFunctionBegin; 1461827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 14623fdc5746SBarry Smith PetscFunctionReturn(0); 1463827bd09bSSatish Balay } 1464827bd09bSSatish Balay 1465827bd09bSSatish Balay 1466827bd09bSSatish Balay 1467827bd09bSSatish Balay /********************************ivec.c************************************** 1468827bd09bSSatish Balay Function rvec_exists() 1469827bd09bSSatish Balay 1470827bd09bSSatish Balay Input : 1471827bd09bSSatish Balay Output: 1472827bd09bSSatish Balay Return: 1473827bd09bSSatish Balay Description: 1474827bd09bSSatish Balay *********************************ivec.c*************************************/ 1475*0924e98cSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1, PetscScalar *arg2, int n) 1476827bd09bSSatish Balay { 14773fdc5746SBarry Smith PetscFunctionBegin; 1478827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 14793fdc5746SBarry Smith PetscFunctionReturn(0); 1480827bd09bSSatish Balay } 1481827bd09bSSatish Balay 1482827bd09bSSatish Balay 1483827bd09bSSatish Balay 1484827bd09bSSatish Balay /**********************************ivec.c************************************** 1485827bd09bSSatish Balay Function rvec_non_uniform() 1486827bd09bSSatish Balay 1487827bd09bSSatish Balay Input : 1488827bd09bSSatish Balay Output: 1489827bd09bSSatish Balay Return: 1490827bd09bSSatish Balay Description: 1491827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1492*0924e98cSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, int n, int *arg3) 1493827bd09bSSatish Balay { 1494a501084fSBarry Smith int i, j, type; 1495827bd09bSSatish Balay 14963fdc5746SBarry Smith PetscFunctionBegin; 1497827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1498827bd09bSSatish Balay for (i=0;i<n;) 1499827bd09bSSatish Balay { 1500827bd09bSSatish Balay /* clump 'em for now */ 1501827bd09bSSatish Balay j=i+1; 1502827bd09bSSatish Balay type = arg3[i]; 1503827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1504827bd09bSSatish Balay {j++;} 1505827bd09bSSatish Balay 1506827bd09bSSatish Balay /* how many together */ 1507827bd09bSSatish Balay j -= i; 1508827bd09bSSatish Balay 1509827bd09bSSatish Balay /* call appropriate ivec function */ 1510827bd09bSSatish Balay if (type == GL_MAX) 1511827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1512827bd09bSSatish Balay else if (type == GL_MIN) 1513827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1514827bd09bSSatish Balay else if (type == GL_MULT) 1515827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1516827bd09bSSatish Balay else if (type == GL_ADD) 1517827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1518827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1519827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1520827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1521827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1522827bd09bSSatish Balay else if (type == GL_EXISTS) 1523827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1524827bd09bSSatish Balay else 1525827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1526827bd09bSSatish Balay 1527827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1528827bd09bSSatish Balay } 15293fdc5746SBarry Smith PetscFunctionReturn(0); 1530827bd09bSSatish Balay } 1531827bd09bSSatish Balay 1532827bd09bSSatish Balay 1533827bd09bSSatish Balay 1534827bd09bSSatish Balay /**********************************ivec.c************************************** 1535827bd09bSSatish Balay Function rvec_fct_addr() 1536827bd09bSSatish Balay 1537827bd09bSSatish Balay Input : 1538827bd09bSSatish Balay Output: 1539827bd09bSSatish Balay Return: 1540827bd09bSSatish Balay Description: 1541827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1542a501084fSBarry Smith vfp rvec_fct_addr( int type) 1543827bd09bSSatish Balay { 1544827bd09bSSatish Balay if (type == NON_UNIFORM) 15453fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);} 1546827bd09bSSatish Balay else if (type == GL_MAX) 15473fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);} 1548827bd09bSSatish Balay else if (type == GL_MIN) 15493fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);} 1550827bd09bSSatish Balay else if (type == GL_MULT) 15513fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);} 1552827bd09bSSatish Balay else if (type == GL_ADD) 15533fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);} 1554827bd09bSSatish Balay else if (type == GL_MAX_ABS) 15553fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);} 1556827bd09bSSatish Balay else if (type == GL_MIN_ABS) 15573fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);} 1558827bd09bSSatish Balay else if (type == GL_EXISTS) 15593fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);} 1560827bd09bSSatish Balay 1561827bd09bSSatish Balay /* catch all ... not good if we get here */ 1562827bd09bSSatish Balay return(NULL); 1563827bd09bSSatish Balay } 1564827bd09bSSatish Balay 1565827bd09bSSatish Balay 1566827bd09bSSatish Balay /****************************************************************************** 1567827bd09bSSatish Balay Function: my_sort(). 1568827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1569827bd09bSSatish Balay Output: sorted list (in ascending order). 1570827bd09bSSatish Balay Return: none. 1571827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1572827bd09bSSatish Balay ******************************************************************************/ 1573*0924e98cSBarry Smith PetscErrorCode rvec_sort( PetscScalar *ar, int Size) 1574827bd09bSSatish Balay { 1575a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1576a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1577a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1578a501084fSBarry Smith long size = (long) Size; 1579827bd09bSSatish Balay 15803fdc5746SBarry Smith PetscFunctionBegin; 1581827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1582827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1583827bd09bSSatish Balay size--; 1584827bd09bSSatish Balay 1585827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1586827bd09bSSatish Balay for (;;) 1587827bd09bSSatish Balay { 1588827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1589827bd09bSSatish Balay if (size > SORT_OPT) 1590827bd09bSSatish Balay { 1591827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1592827bd09bSSatish Balay pi = ar+1; 1593827bd09bSSatish Balay pj = ar+size; 1594827bd09bSSatish Balay 1595827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1596827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1597827bd09bSSatish Balay 1598827bd09bSSatish Balay pj = ar+size; 1599827bd09bSSatish Balay 1600827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1601827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1602827bd09bSSatish Balay if (*pi > *pj) 1603827bd09bSSatish Balay {SWAP(*pi,*pj)} 1604827bd09bSSatish Balay if (*ar > *pj) 1605827bd09bSSatish Balay {SWAP(*ar,*pj)} 1606827bd09bSSatish Balay else if (*pi > *ar) 1607827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1608827bd09bSSatish Balay 1609827bd09bSSatish Balay /* partition about pivot_value ... */ 1610827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1611827bd09bSSatish Balay for(;;) 1612827bd09bSSatish Balay { 1613827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1614827bd09bSSatish Balay do pi++; while (*pi<*ar); 1615827bd09bSSatish Balay do pj--; while (*pj>*ar); 1616827bd09bSSatish Balay 1617827bd09bSSatish Balay /* if we've crossed we're done */ 1618827bd09bSSatish Balay if (pj<pi) break; 1619827bd09bSSatish Balay 1620827bd09bSSatish Balay /* else swap */ 1621827bd09bSSatish Balay SWAP(*pi,*pj) 1622827bd09bSSatish Balay } 1623827bd09bSSatish Balay 1624827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1625827bd09bSSatish Balay SWAP(*ar,*pj) 1626827bd09bSSatish Balay 1627827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1628827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1629827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1630827bd09bSSatish Balay 1631827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1632827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1633827bd09bSSatish Balay { 1634827bd09bSSatish Balay *(top_a++) = pi; 1635827bd09bSSatish Balay size -= *top_s+2; 1636827bd09bSSatish Balay top_s++; 1637827bd09bSSatish Balay } 1638827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1639827bd09bSSatish Balay else if (size -= *top_s+2) 1640827bd09bSSatish Balay {;} 1641827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1642827bd09bSSatish Balay else 1643827bd09bSSatish Balay { 1644827bd09bSSatish Balay ar = *(--top_a); 1645827bd09bSSatish Balay size = *(--top_s); 1646827bd09bSSatish Balay } 1647827bd09bSSatish Balay } 1648827bd09bSSatish Balay 1649827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1650827bd09bSSatish Balay else 1651827bd09bSSatish Balay { 1652827bd09bSSatish Balay /* insertion sort for bottom */ 1653827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1654827bd09bSSatish Balay { 1655827bd09bSSatish Balay temp = *pj; 1656827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1657827bd09bSSatish Balay { 1658827bd09bSSatish Balay if (*pi <= temp) break; 1659827bd09bSSatish Balay *(pi+1)=*pi; 1660827bd09bSSatish Balay } 1661827bd09bSSatish Balay *(pi+1)=temp; 1662827bd09bSSatish Balay } 1663827bd09bSSatish Balay 1664827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 16653fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1666827bd09bSSatish Balay 1667827bd09bSSatish Balay /* else pop another list from the stack */ 1668827bd09bSSatish Balay ar = *(--top_a); 1669827bd09bSSatish Balay size = *(--top_s); 1670827bd09bSSatish Balay } 1671827bd09bSSatish Balay } 16723fdc5746SBarry Smith PetscFunctionReturn(0); 1673827bd09bSSatish Balay } 1674827bd09bSSatish Balay 1675827bd09bSSatish Balay 1676827bd09bSSatish Balay 1677827bd09bSSatish Balay /****************************************************************************** 1678827bd09bSSatish Balay Function: my_sort(). 1679827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1680827bd09bSSatish Balay Output: sorted list (in ascending order). 1681827bd09bSSatish Balay Return: none. 1682827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1683827bd09bSSatish Balay ******************************************************************************/ 1684*0924e98cSBarry Smith PetscErrorCode rvec_sort_companion( PetscScalar *ar, int *ar2, int Size) 1685827bd09bSSatish Balay { 1686a501084fSBarry Smith PetscScalar *pi, *pj, temp; 1687a501084fSBarry Smith PetscScalar **top_a = (PetscScalar **)offset_stack; 1688a501084fSBarry Smith long *top_s = psize_stack, *bottom_s = psize_stack; 1689a501084fSBarry Smith long size = (long) Size; 1690827bd09bSSatish Balay 1691a501084fSBarry Smith int *pi2, *pj2; 1692a501084fSBarry Smith int ptr; 1693a501084fSBarry Smith long mid; 1694827bd09bSSatish Balay 16953fdc5746SBarry Smith PetscFunctionBegin; 1696827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1697827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1698827bd09bSSatish Balay size--; 1699827bd09bSSatish Balay 1700827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1701827bd09bSSatish Balay for (;;) 1702827bd09bSSatish Balay { 1703827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1704827bd09bSSatish Balay if (size > SORT_OPT) 1705827bd09bSSatish Balay { 1706827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1707827bd09bSSatish Balay mid = size>>1; 1708827bd09bSSatish Balay pi = ar+1; 1709827bd09bSSatish Balay pj = ar+mid; 1710827bd09bSSatish Balay pi2 = ar2+1; 1711827bd09bSSatish Balay pj2 = ar2+mid; 1712827bd09bSSatish Balay 1713827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1714827bd09bSSatish Balay SWAP(*pi,*pj) 1715827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1716827bd09bSSatish Balay 1717827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1718827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1719827bd09bSSatish Balay pj = ar+size; 1720827bd09bSSatish Balay pj2 = ar2+size; 1721827bd09bSSatish Balay if (*pi > *pj) 1722827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1723827bd09bSSatish Balay if (*ar > *pj) 1724827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1725827bd09bSSatish Balay else if (*pi > *ar) 1726827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1727827bd09bSSatish Balay 1728827bd09bSSatish Balay /* partition about pivot_value ... */ 1729827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1730827bd09bSSatish Balay for(;;) 1731827bd09bSSatish Balay { 1732827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1733827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1734827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1735827bd09bSSatish Balay 1736827bd09bSSatish Balay /* if we've crossed we're done */ 1737827bd09bSSatish Balay if (pj<pi) break; 1738827bd09bSSatish Balay 1739827bd09bSSatish Balay /* else swap */ 1740827bd09bSSatish Balay SWAP(*pi,*pj) 1741827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1742827bd09bSSatish Balay } 1743827bd09bSSatish Balay 1744827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1745827bd09bSSatish Balay SWAP(*ar,*pj) 1746827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1747827bd09bSSatish Balay 1748827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1749827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1750827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1751827bd09bSSatish Balay 1752827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1753827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1754827bd09bSSatish Balay { 1755827bd09bSSatish Balay *(top_a++) = pi; 1756a501084fSBarry Smith *(top_a++) = (PetscScalar *) pi2; 1757827bd09bSSatish Balay size -= *top_s+2; 1758827bd09bSSatish Balay top_s++; 1759827bd09bSSatish Balay } 1760827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1761827bd09bSSatish Balay else if (size -= *top_s+2) 1762827bd09bSSatish Balay {;} 1763827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1764827bd09bSSatish Balay else 1765827bd09bSSatish Balay { 1766827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1767827bd09bSSatish Balay ar = *(--top_a); 1768827bd09bSSatish Balay size = *(--top_s); 1769827bd09bSSatish Balay } 1770827bd09bSSatish Balay } 1771827bd09bSSatish Balay 1772827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1773827bd09bSSatish Balay else 1774827bd09bSSatish Balay { 1775827bd09bSSatish Balay /* insertion sort for bottom */ 1776827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1777827bd09bSSatish Balay { 1778827bd09bSSatish Balay temp = *pj; 1779827bd09bSSatish Balay ptr = *pj2; 1780827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1781827bd09bSSatish Balay { 1782827bd09bSSatish Balay if (*pi <= temp) break; 1783827bd09bSSatish Balay *(pi+1)=*pi; 1784827bd09bSSatish Balay *(pi2+1)=*pi2; 1785827bd09bSSatish Balay } 1786827bd09bSSatish Balay *(pi+1)=temp; 1787827bd09bSSatish Balay *(pi2+1)=ptr; 1788827bd09bSSatish Balay } 1789827bd09bSSatish Balay 1790827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 17913fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 1792827bd09bSSatish Balay 1793827bd09bSSatish Balay /* else pop another list from the stack */ 1794827bd09bSSatish Balay ar2 = (int*) *(--top_a); 1795827bd09bSSatish Balay ar = *(--top_a); 1796827bd09bSSatish Balay size = *(--top_s); 1797827bd09bSSatish Balay } 1798827bd09bSSatish Balay } 17993fdc5746SBarry Smith PetscFunctionReturn(0); 1800827bd09bSSatish Balay } 1801827bd09bSSatish Balay 1802827bd09bSSatish Balay 1803827bd09bSSatish Balay 1804827bd09bSSatish Balay 1805827bd09bSSatish Balay 1806827bd09bSSatish Balay /**********************************ivec.c************************************** 1807827bd09bSSatish Balay Function ivec_binary_search() 1808827bd09bSSatish Balay 1809827bd09bSSatish Balay Input : 1810827bd09bSSatish Balay Output: 1811827bd09bSSatish Balay Return: 1812827bd09bSSatish Balay Description: 1813827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1814827bd09bSSatish Balay int 1815a501084fSBarry Smith rvec_binary_search( PetscScalar item, PetscScalar *list, int rh) 1816827bd09bSSatish Balay { 1817a501084fSBarry Smith int mid, lh=0; 18183fdc5746SBarry Smith PetscFunctionBegin; 1819827bd09bSSatish Balay rh--; 1820827bd09bSSatish Balay while (lh<=rh) 1821827bd09bSSatish Balay { 1822827bd09bSSatish Balay mid = (lh+rh)>>1; 1823827bd09bSSatish Balay if (*(list+mid) == item) 1824827bd09bSSatish Balay {return(mid);} 1825827bd09bSSatish Balay if (*(list+mid) > item) 1826827bd09bSSatish Balay {rh = mid-1;} 1827827bd09bSSatish Balay else 1828827bd09bSSatish Balay {lh = mid+1;} 1829827bd09bSSatish Balay } 1830827bd09bSSatish Balay return(-1); 1831827bd09bSSatish Balay } 1832827bd09bSSatish Balay 1833827bd09bSSatish Balay 1834827bd09bSSatish Balay 1835827bd09bSSatish Balay 1836827bd09bSSatish Balay 1837