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]; 33827bd09bSSatish Balay 34827bd09bSSatish Balay /**********************************ivec.c************************************** 35827bd09bSSatish Balay Function ivec_copy() 36827bd09bSSatish Balay 37827bd09bSSatish Balay Input : 38827bd09bSSatish Balay Output: 39827bd09bSSatish Balay Return: 40827bd09bSSatish Balay Description: 41827bd09bSSatish Balay ***********************************ivec.c*************************************/ 42a501084fSBarry Smith int *ivec_copy( int *arg1, int *arg2, int n) 43827bd09bSSatish Balay { 44827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 45827bd09bSSatish Balay return(arg1); 46827bd09bSSatish Balay } 47827bd09bSSatish Balay 48827bd09bSSatish Balay 49827bd09bSSatish Balay 50827bd09bSSatish Balay /**********************************ivec.c************************************** 51827bd09bSSatish Balay Function ivec_zero() 52827bd09bSSatish Balay 53827bd09bSSatish Balay Input : 54827bd09bSSatish Balay Output: 55827bd09bSSatish Balay Return: 56827bd09bSSatish Balay Description: 57827bd09bSSatish Balay ***********************************ivec.c*************************************/ 580924e98cSBarry Smith PetscErrorCode ivec_zero( int *arg1, int n) 59827bd09bSSatish Balay { 603fdc5746SBarry Smith PetscFunctionBegin; 61827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 623fdc5746SBarry Smith PetscFunctionReturn(0); 63827bd09bSSatish Balay } 64827bd09bSSatish Balay 65827bd09bSSatish Balay /**********************************ivec.c************************************** 66827bd09bSSatish Balay Function ivec_set() 67827bd09bSSatish Balay 68827bd09bSSatish Balay Input : 69827bd09bSSatish Balay Output: 70827bd09bSSatish Balay Return: 71827bd09bSSatish Balay Description: 72827bd09bSSatish Balay ***********************************ivec.c*************************************/ 730924e98cSBarry Smith PetscErrorCode ivec_set( int *arg1, int arg2, int n) 74827bd09bSSatish Balay { 753fdc5746SBarry Smith PetscFunctionBegin; 76827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 773fdc5746SBarry Smith PetscFunctionReturn(0); 78827bd09bSSatish Balay } 79827bd09bSSatish Balay 80827bd09bSSatish Balay /**********************************ivec.c************************************** 81827bd09bSSatish Balay Function ivec_max() 82827bd09bSSatish Balay 83827bd09bSSatish Balay Input : 84827bd09bSSatish Balay Output: 85827bd09bSSatish Balay Return: 86827bd09bSSatish Balay Description: 87827bd09bSSatish Balay ***********************************ivec.c*************************************/ 880924e98cSBarry Smith PetscErrorCode ivec_max( int *arg1, int *arg2, int n) 89827bd09bSSatish Balay { 903fdc5746SBarry Smith PetscFunctionBegin; 9139945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 923fdc5746SBarry Smith PetscFunctionReturn(0); 93827bd09bSSatish Balay } 94827bd09bSSatish Balay 95827bd09bSSatish Balay 96827bd09bSSatish Balay 97827bd09bSSatish Balay /**********************************ivec.c************************************** 98827bd09bSSatish Balay Function ivec_min() 99827bd09bSSatish Balay 100827bd09bSSatish Balay Input : 101827bd09bSSatish Balay Output: 102827bd09bSSatish Balay Return: 103827bd09bSSatish Balay Description: 104827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1050924e98cSBarry Smith PetscErrorCode ivec_min( int *arg1, int *arg2, int n) 106827bd09bSSatish Balay { 1073fdc5746SBarry Smith PetscFunctionBegin; 10839945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 1093fdc5746SBarry Smith PetscFunctionReturn(0); 110827bd09bSSatish Balay } 111827bd09bSSatish Balay 112827bd09bSSatish Balay 113827bd09bSSatish Balay 114827bd09bSSatish Balay /**********************************ivec.c************************************** 115827bd09bSSatish Balay Function ivec_mult() 116827bd09bSSatish Balay 117827bd09bSSatish Balay Input : 118827bd09bSSatish Balay Output: 119827bd09bSSatish Balay Return: 120827bd09bSSatish Balay Description: 121827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1220924e98cSBarry Smith PetscErrorCode ivec_mult( int *arg1, int *arg2, int n) 123827bd09bSSatish Balay { 1243fdc5746SBarry Smith PetscFunctionBegin; 125827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1263fdc5746SBarry Smith PetscFunctionReturn(0); 127827bd09bSSatish Balay } 128827bd09bSSatish Balay 129827bd09bSSatish Balay 130827bd09bSSatish Balay 131827bd09bSSatish Balay /**********************************ivec.c************************************** 132827bd09bSSatish Balay Function ivec_add() 133827bd09bSSatish Balay 134827bd09bSSatish Balay Input : 135827bd09bSSatish Balay Output: 136827bd09bSSatish Balay Return: 137827bd09bSSatish Balay Description: 138827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1390924e98cSBarry Smith PetscErrorCode ivec_add( int *arg1, int *arg2, int n) 140827bd09bSSatish Balay { 1413fdc5746SBarry Smith PetscFunctionBegin; 142827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1433fdc5746SBarry Smith PetscFunctionReturn(0); 144827bd09bSSatish Balay } 145827bd09bSSatish Balay 146827bd09bSSatish Balay 147827bd09bSSatish Balay 148827bd09bSSatish Balay /**********************************ivec.c************************************** 149827bd09bSSatish Balay Function ivec_lxor() 150827bd09bSSatish Balay 151827bd09bSSatish Balay Input : 152827bd09bSSatish Balay Output: 153827bd09bSSatish Balay Return: 154827bd09bSSatish Balay Description: 155827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1560924e98cSBarry Smith PetscErrorCode ivec_lxor( int *arg1, int *arg2, int n) 157827bd09bSSatish Balay { 1583fdc5746SBarry Smith PetscFunctionBegin; 159827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 1603fdc5746SBarry Smith PetscFunctionReturn(0); 161827bd09bSSatish Balay } 162827bd09bSSatish Balay 163827bd09bSSatish Balay 164827bd09bSSatish Balay 165827bd09bSSatish Balay /**********************************ivec.c************************************** 166827bd09bSSatish Balay Function ivec_xor() 167827bd09bSSatish Balay 168827bd09bSSatish Balay Input : 169827bd09bSSatish Balay Output: 170827bd09bSSatish Balay Return: 171827bd09bSSatish Balay Description: 172827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1730924e98cSBarry Smith PetscErrorCode ivec_xor( int *arg1, int *arg2, int n) 174827bd09bSSatish Balay { 1753fdc5746SBarry Smith PetscFunctionBegin; 176827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 1773fdc5746SBarry Smith PetscFunctionReturn(0); 178827bd09bSSatish Balay } 179827bd09bSSatish Balay 180827bd09bSSatish Balay 181827bd09bSSatish Balay 182827bd09bSSatish Balay /**********************************ivec.c************************************** 183827bd09bSSatish Balay Function ivec_or() 184827bd09bSSatish Balay 185827bd09bSSatish Balay Input : 186827bd09bSSatish Balay Output: 187827bd09bSSatish Balay Return: 188827bd09bSSatish Balay Description: 189827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1900924e98cSBarry Smith PetscErrorCode ivec_or( int *arg1, int *arg2, int n) 191827bd09bSSatish Balay { 1923fdc5746SBarry Smith PetscFunctionBegin; 193827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 1943fdc5746SBarry Smith PetscFunctionReturn(0); 195827bd09bSSatish Balay } 196827bd09bSSatish Balay 197827bd09bSSatish Balay 198827bd09bSSatish Balay 199827bd09bSSatish Balay /**********************************ivec.c************************************** 200827bd09bSSatish Balay Function ivec_lor() 201827bd09bSSatish Balay 202827bd09bSSatish Balay Input : 203827bd09bSSatish Balay Output: 204827bd09bSSatish Balay Return: 205827bd09bSSatish Balay Description: 206827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2070924e98cSBarry Smith PetscErrorCode ivec_lor( int *arg1, int *arg2, int n) 208827bd09bSSatish Balay { 2093fdc5746SBarry Smith PetscFunctionBegin; 210827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 2113fdc5746SBarry Smith PetscFunctionReturn(0); 212827bd09bSSatish Balay } 213827bd09bSSatish Balay 214827bd09bSSatish Balay /**********************************ivec.c************************************** 215827bd09bSSatish Balay Function ivec_and() 216827bd09bSSatish Balay 217827bd09bSSatish Balay Input : 218827bd09bSSatish Balay Output: 219827bd09bSSatish Balay Return: 220827bd09bSSatish Balay Description: 221827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2220924e98cSBarry Smith PetscErrorCode ivec_and( int *arg1, int *arg2, int n) 223827bd09bSSatish Balay { 2243fdc5746SBarry Smith PetscFunctionBegin; 225827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 2263fdc5746SBarry Smith PetscFunctionReturn(0); 227827bd09bSSatish Balay } 228827bd09bSSatish Balay 229827bd09bSSatish Balay 230827bd09bSSatish Balay 231827bd09bSSatish Balay /**********************************ivec.c************************************** 232827bd09bSSatish Balay Function ivec_land() 233827bd09bSSatish Balay 234827bd09bSSatish Balay Input : 235827bd09bSSatish Balay Output: 236827bd09bSSatish Balay Return: 237827bd09bSSatish Balay Description: 238827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2390924e98cSBarry Smith PetscErrorCode ivec_land( int *arg1, int *arg2, int n) 240827bd09bSSatish Balay { 2413fdc5746SBarry Smith PetscFunctionBegin; 242827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 2433fdc5746SBarry Smith PetscFunctionReturn(0); 244827bd09bSSatish Balay } 245827bd09bSSatish Balay 246827bd09bSSatish Balay 247827bd09bSSatish Balay 248827bd09bSSatish Balay /**********************************ivec.c************************************** 249827bd09bSSatish Balay Function ivec_and3() 250827bd09bSSatish Balay 251827bd09bSSatish Balay Input : 252827bd09bSSatish Balay Output: 253827bd09bSSatish Balay Return: 254827bd09bSSatish Balay Description: 255827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2560924e98cSBarry Smith PetscErrorCode ivec_and3( int *arg1, int *arg2, int *arg3, int n) 257827bd09bSSatish Balay { 2583fdc5746SBarry Smith PetscFunctionBegin; 259827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 2603fdc5746SBarry Smith PetscFunctionReturn(0); 261827bd09bSSatish Balay } 262827bd09bSSatish Balay 263827bd09bSSatish Balay 264827bd09bSSatish Balay 265827bd09bSSatish Balay /**********************************ivec.c************************************** 266827bd09bSSatish Balay Function ivec_sum 267827bd09bSSatish Balay 268827bd09bSSatish Balay Input : 269827bd09bSSatish Balay Output: 270827bd09bSSatish Balay Return: 271827bd09bSSatish Balay Description: 272827bd09bSSatish Balay ***********************************ivec.c*************************************/ 273a501084fSBarry Smith int ivec_sum( int *arg1, int n) 274827bd09bSSatish Balay { 275a501084fSBarry Smith int tmp = 0; 276827bd09bSSatish Balay 277827bd09bSSatish Balay 278827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 279827bd09bSSatish Balay return(tmp); 280827bd09bSSatish Balay } 281827bd09bSSatish Balay 282827bd09bSSatish Balay /**********************************ivec.c************************************** 283827bd09bSSatish Balay Function ivec_non_uniform() 284827bd09bSSatish Balay 285827bd09bSSatish Balay Input : 286827bd09bSSatish Balay Output: 287827bd09bSSatish Balay Return: 288827bd09bSSatish Balay Description: 289827bd09bSSatish Balay ***********************************ivec.c*************************************/ 2900924e98cSBarry Smith PetscErrorCode ivec_non_uniform(int *arg1, int *arg2, int n, int *arg3) 291827bd09bSSatish Balay { 292a501084fSBarry Smith int i, j, type; 293827bd09bSSatish Balay 294827bd09bSSatish Balay 2953fdc5746SBarry Smith PetscFunctionBegin; 296827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 297827bd09bSSatish Balay for (i=0;i<n;) 298827bd09bSSatish Balay { 299827bd09bSSatish Balay /* clump 'em for now */ 300827bd09bSSatish Balay j=i+1; 301827bd09bSSatish Balay type = arg3[i]; 302827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 303827bd09bSSatish Balay {j++;} 304827bd09bSSatish Balay 305827bd09bSSatish Balay /* how many together */ 306827bd09bSSatish Balay j -= i; 307827bd09bSSatish Balay 308827bd09bSSatish Balay /* call appropriate ivec function */ 309827bd09bSSatish Balay if (type == GL_MAX) 310827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 311827bd09bSSatish Balay else if (type == GL_MIN) 312827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 313827bd09bSSatish Balay else if (type == GL_MULT) 314827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 315827bd09bSSatish Balay else if (type == GL_ADD) 316827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 317827bd09bSSatish Balay else if (type == GL_B_XOR) 318827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 319827bd09bSSatish Balay else if (type == GL_B_OR) 320827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 321827bd09bSSatish Balay else if (type == GL_B_AND) 322827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 323827bd09bSSatish Balay else if (type == GL_L_XOR) 324827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 325827bd09bSSatish Balay else if (type == GL_L_OR) 326827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 327827bd09bSSatish Balay else if (type == GL_L_AND) 328827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 329827bd09bSSatish Balay else 330827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 331827bd09bSSatish Balay 332827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 333827bd09bSSatish Balay } 3343fdc5746SBarry Smith PetscFunctionReturn(0); 335827bd09bSSatish Balay } 336827bd09bSSatish Balay 337827bd09bSSatish Balay 338827bd09bSSatish Balay 339827bd09bSSatish Balay /**********************************ivec.c************************************** 340827bd09bSSatish Balay Function ivec_addr() 341827bd09bSSatish Balay 342827bd09bSSatish Balay Input : 343827bd09bSSatish Balay Output: 344827bd09bSSatish Balay Return: 345827bd09bSSatish Balay Description: 346827bd09bSSatish Balay ***********************************ivec.c*************************************/ 347a501084fSBarry Smith vfp ivec_fct_addr( int type) 348827bd09bSSatish Balay { 3493fdc5746SBarry Smith PetscFunctionBegin; 350827bd09bSSatish Balay if (type == NON_UNIFORM) 3513fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);} 352827bd09bSSatish Balay else if (type == GL_MAX) 3533fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);} 354827bd09bSSatish Balay else if (type == GL_MIN) 3553fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);} 356827bd09bSSatish Balay else if (type == GL_MULT) 3573fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);} 358827bd09bSSatish Balay else if (type == GL_ADD) 3593fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);} 360827bd09bSSatish Balay else if (type == GL_B_XOR) 3613fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);} 362827bd09bSSatish Balay else if (type == GL_B_OR) 3633fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);} 364827bd09bSSatish Balay else if (type == GL_B_AND) 3653fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);} 366827bd09bSSatish Balay else if (type == GL_L_XOR) 3673fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);} 368827bd09bSSatish Balay else if (type == GL_L_OR) 3693fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);} 370827bd09bSSatish Balay else if (type == GL_L_AND) 3713fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);} 372827bd09bSSatish Balay 373827bd09bSSatish Balay /* catch all ... not good if we get here */ 374827bd09bSSatish Balay return(NULL); 375827bd09bSSatish Balay } 376827bd09bSSatish Balay 377827bd09bSSatish Balay 378827bd09bSSatish Balay /****************************************************************************** 379827bd09bSSatish Balay Function: ivec_sort(). 380827bd09bSSatish Balay 381827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 382827bd09bSSatish Balay Output: sorted list (in ascending order). 383827bd09bSSatish Balay Return: none. 384827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 385827bd09bSSatish Balay ******************************************************************************/ 3860924e98cSBarry Smith PetscErrorCode ivec_sort( int *ar, int size) 387827bd09bSSatish Balay { 388a501084fSBarry Smith int *pi, *pj, temp; 389a501084fSBarry Smith int **top_a = (int **) offset_stack; 390a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 391827bd09bSSatish Balay 392827bd09bSSatish Balay 393827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 394827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 395827bd09bSSatish Balay size--; 396827bd09bSSatish Balay 397827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 398827bd09bSSatish Balay for (;;) 399827bd09bSSatish Balay { 400827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 401827bd09bSSatish Balay if (size > SORT_OPT) 402827bd09bSSatish Balay { 403827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 404827bd09bSSatish Balay pi = ar+1; 405827bd09bSSatish Balay pj = ar+size; 406827bd09bSSatish Balay 407827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 408827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 409827bd09bSSatish Balay 410827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 411827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 412827bd09bSSatish Balay if (*pi > *pj) 413827bd09bSSatish Balay {SWAP(*pi,*pj)} 414827bd09bSSatish Balay if (*ar > *pj) 415827bd09bSSatish Balay {SWAP(*ar,*pj)} 416827bd09bSSatish Balay else if (*pi > *ar) 417827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 418827bd09bSSatish Balay 419827bd09bSSatish Balay /* partition about pivot_value ... */ 420827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 421827bd09bSSatish Balay for(;;) 422827bd09bSSatish Balay { 423827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 424827bd09bSSatish Balay do pi++; while (*pi<*ar); 425827bd09bSSatish Balay do pj--; while (*pj>*ar); 426827bd09bSSatish Balay 427827bd09bSSatish Balay /* if we've crossed we're done */ 428827bd09bSSatish Balay if (pj<pi) break; 429827bd09bSSatish Balay 430827bd09bSSatish Balay /* else swap */ 431827bd09bSSatish Balay SWAP(*pi,*pj) 432827bd09bSSatish Balay } 433827bd09bSSatish Balay 434827bd09bSSatish Balay /* place pivot_value in it's correct location */ 435827bd09bSSatish Balay SWAP(*ar,*pj) 436827bd09bSSatish Balay 437827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 438827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 439827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 440827bd09bSSatish Balay 441827bd09bSSatish Balay /* push right hand child iff length > 1 */ 442827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 443827bd09bSSatish Balay { 444827bd09bSSatish Balay *(top_a++) = pi; 445827bd09bSSatish Balay size -= *top_s+2; 446827bd09bSSatish Balay top_s++; 447827bd09bSSatish Balay } 448827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 449827bd09bSSatish Balay else if (size -= *top_s+2) 450827bd09bSSatish Balay {;} 451827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 452827bd09bSSatish Balay else 453827bd09bSSatish Balay { 454827bd09bSSatish Balay ar = *(--top_a); 455827bd09bSSatish Balay size = *(--top_s); 456827bd09bSSatish Balay } 457827bd09bSSatish Balay } 458827bd09bSSatish Balay 459827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 460827bd09bSSatish Balay else 461827bd09bSSatish Balay { 462827bd09bSSatish Balay /* insertion sort for bottom */ 463827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 464827bd09bSSatish Balay { 465827bd09bSSatish Balay temp = *pj; 466827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 467827bd09bSSatish Balay { 468827bd09bSSatish Balay if (*pi <= temp) break; 469827bd09bSSatish Balay *(pi+1)=*pi; 470827bd09bSSatish Balay } 471827bd09bSSatish Balay *(pi+1)=temp; 472827bd09bSSatish Balay } 473827bd09bSSatish Balay 474827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4753fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 476827bd09bSSatish Balay 477827bd09bSSatish Balay /* else pop another list from the stack */ 478827bd09bSSatish Balay ar = *(--top_a); 479827bd09bSSatish Balay size = *(--top_s); 480827bd09bSSatish Balay } 481827bd09bSSatish Balay } 4823fdc5746SBarry Smith PetscFunctionReturn(0); 483827bd09bSSatish Balay } 484827bd09bSSatish Balay 485827bd09bSSatish Balay 486827bd09bSSatish Balay 487827bd09bSSatish Balay /****************************************************************************** 488827bd09bSSatish Balay Function: ivec_sort_companion(). 489827bd09bSSatish Balay 490827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 491827bd09bSSatish Balay Output: sorted list (in ascending order). 492827bd09bSSatish Balay Return: none. 493827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 494827bd09bSSatish Balay ******************************************************************************/ 4950924e98cSBarry Smith PetscErrorCode ivec_sort_companion( int *ar, int *ar2, int size) 496827bd09bSSatish Balay { 497a501084fSBarry Smith int *pi, *pj, temp, temp2; 498a501084fSBarry Smith int **top_a = (int **)offset_stack; 499a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 500a501084fSBarry Smith int *pi2, *pj2; 501a501084fSBarry Smith int mid; 502827bd09bSSatish Balay 5033fdc5746SBarry Smith PetscFunctionBegin; 504827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 505827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 506827bd09bSSatish Balay size--; 507827bd09bSSatish Balay 508827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 509827bd09bSSatish Balay for (;;) 510827bd09bSSatish Balay { 511827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 512827bd09bSSatish Balay if (size > SORT_OPT) 513827bd09bSSatish Balay { 514827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 515827bd09bSSatish Balay mid = size>>1; 516827bd09bSSatish Balay pi = ar+1; 517827bd09bSSatish Balay pj = ar+mid; 518827bd09bSSatish Balay pi2 = ar2+1; 519827bd09bSSatish Balay pj2 = ar2+mid; 520827bd09bSSatish Balay 521827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 522827bd09bSSatish Balay SWAP(*pi,*pj) 523827bd09bSSatish Balay SWAP(*pi2,*pj2) 524827bd09bSSatish Balay 525827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 526827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 527827bd09bSSatish Balay pj = ar+size; 528827bd09bSSatish Balay pj2 = ar2+size; 529827bd09bSSatish Balay if (*pi > *pj) 530827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 531827bd09bSSatish Balay if (*ar > *pj) 532827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 533827bd09bSSatish Balay else if (*pi > *ar) 534827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 535827bd09bSSatish Balay 536827bd09bSSatish Balay /* partition about pivot_value ... */ 537827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 538827bd09bSSatish Balay for(;;) 539827bd09bSSatish Balay { 540827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 541827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 542827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 543827bd09bSSatish Balay 544827bd09bSSatish Balay /* if we've crossed we're done */ 545827bd09bSSatish Balay if (pj<pi) break; 546827bd09bSSatish Balay 547827bd09bSSatish Balay /* else swap */ 548827bd09bSSatish Balay SWAP(*pi,*pj) 549827bd09bSSatish Balay SWAP(*pi2,*pj2) 550827bd09bSSatish Balay } 551827bd09bSSatish Balay 552827bd09bSSatish Balay /* place pivot_value in it's correct location */ 553827bd09bSSatish Balay SWAP(*ar,*pj) 554827bd09bSSatish Balay SWAP(*ar2,*pj2) 555827bd09bSSatish Balay 556827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 557827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 558827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 559827bd09bSSatish Balay 560827bd09bSSatish Balay /* push right hand child iff length > 1 */ 561827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 562827bd09bSSatish Balay { 563827bd09bSSatish Balay *(top_a++) = pi; 564827bd09bSSatish Balay *(top_a++) = pi2; 565827bd09bSSatish Balay size -= *top_s+2; 566827bd09bSSatish Balay top_s++; 567827bd09bSSatish Balay } 568827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 569827bd09bSSatish Balay else if (size -= *top_s+2) 570827bd09bSSatish Balay {;} 571827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 572827bd09bSSatish Balay else 573827bd09bSSatish Balay { 574827bd09bSSatish Balay ar2 = *(--top_a); 575827bd09bSSatish Balay ar = *(--top_a); 576827bd09bSSatish Balay size = *(--top_s); 577827bd09bSSatish Balay } 578827bd09bSSatish Balay } 579827bd09bSSatish Balay 580827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 581827bd09bSSatish Balay else 582827bd09bSSatish Balay { 583827bd09bSSatish Balay /* insertion sort for bottom */ 584827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 585827bd09bSSatish Balay { 586827bd09bSSatish Balay temp = *pj; 587827bd09bSSatish Balay temp2 = *pj2; 588827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 589827bd09bSSatish Balay { 590827bd09bSSatish Balay if (*pi <= temp) break; 591827bd09bSSatish Balay *(pi+1)=*pi; 592827bd09bSSatish Balay *(pi2+1)=*pi2; 593827bd09bSSatish Balay } 594827bd09bSSatish Balay *(pi+1)=temp; 595827bd09bSSatish Balay *(pi2+1)=temp2; 596827bd09bSSatish Balay } 597827bd09bSSatish Balay 598827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 5993fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 600827bd09bSSatish Balay 601827bd09bSSatish Balay /* else pop another list from the stack */ 602827bd09bSSatish Balay ar2 = *(--top_a); 603827bd09bSSatish Balay ar = *(--top_a); 604827bd09bSSatish Balay size = *(--top_s); 605827bd09bSSatish Balay } 606827bd09bSSatish Balay } 6073fdc5746SBarry Smith PetscFunctionReturn(0); 608827bd09bSSatish Balay } 609827bd09bSSatish Balay 610827bd09bSSatish Balay 611827bd09bSSatish Balay 612827bd09bSSatish Balay /****************************************************************************** 613827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 614827bd09bSSatish Balay 615827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 616827bd09bSSatish Balay Output: sorted list (in ascending order). 617827bd09bSSatish Balay Return: none. 618827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 619827bd09bSSatish Balay ******************************************************************************/ 620*1d7d0905SBarry Smith PetscErrorCode ivec_sort_companion_hack( int *ar, int **ar2, int size) 621827bd09bSSatish Balay { 622a501084fSBarry Smith int *pi, *pj, temp, *ptr; 623a501084fSBarry Smith int **top_a = (int **)offset_stack; 624a501084fSBarry Smith int *top_s = size_stack, *bottom_s = size_stack; 625a501084fSBarry Smith int **pi2, **pj2; 626a501084fSBarry Smith int mid; 627827bd09bSSatish Balay 6283fdc5746SBarry Smith PetscFunctionBegin; 629827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 630827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 631827bd09bSSatish Balay size--; 632827bd09bSSatish Balay 633827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 634827bd09bSSatish Balay for (;;) 635827bd09bSSatish Balay { 636827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 637827bd09bSSatish Balay if (size > SORT_OPT) 638827bd09bSSatish Balay { 639827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 640827bd09bSSatish Balay mid = size>>1; 641827bd09bSSatish Balay pi = ar+1; 642827bd09bSSatish Balay pj = ar+mid; 643827bd09bSSatish Balay pi2 = ar2+1; 644827bd09bSSatish Balay pj2 = ar2+mid; 645827bd09bSSatish Balay 646827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 647827bd09bSSatish Balay SWAP(*pi,*pj) 648827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 649827bd09bSSatish Balay 650827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 651827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 652827bd09bSSatish Balay pj = ar+size; 653827bd09bSSatish Balay pj2 = ar2+size; 654827bd09bSSatish Balay if (*pi > *pj) 655827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 656827bd09bSSatish Balay if (*ar > *pj) 657827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 658827bd09bSSatish Balay else if (*pi > *ar) 659827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 660827bd09bSSatish Balay 661827bd09bSSatish Balay /* partition about pivot_value ... */ 662827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 663827bd09bSSatish Balay for(;;) 664827bd09bSSatish Balay { 665827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 666827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 667827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 668827bd09bSSatish Balay 669827bd09bSSatish Balay /* if we've crossed we're done */ 670827bd09bSSatish Balay if (pj<pi) break; 671827bd09bSSatish Balay 672827bd09bSSatish Balay /* else swap */ 673827bd09bSSatish Balay SWAP(*pi,*pj) 674827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 675827bd09bSSatish Balay } 676827bd09bSSatish Balay 677827bd09bSSatish Balay /* place pivot_value in it's correct location */ 678827bd09bSSatish Balay SWAP(*ar,*pj) 679827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 680827bd09bSSatish Balay 681827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 682827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 683827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 684827bd09bSSatish Balay 685827bd09bSSatish Balay /* push right hand child iff length > 1 */ 686827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 687827bd09bSSatish Balay { 688827bd09bSSatish Balay *(top_a++) = pi; 689827bd09bSSatish Balay *(top_a++) = (int*) pi2; 690827bd09bSSatish Balay size -= *top_s+2; 691827bd09bSSatish Balay top_s++; 692827bd09bSSatish Balay } 693827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 694827bd09bSSatish Balay else if (size -= *top_s+2) 695827bd09bSSatish Balay {;} 696827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 697827bd09bSSatish Balay else 698827bd09bSSatish Balay { 699827bd09bSSatish Balay ar2 = (int **) *(--top_a); 700827bd09bSSatish Balay ar = *(--top_a); 701827bd09bSSatish Balay size = *(--top_s); 702827bd09bSSatish Balay } 703827bd09bSSatish Balay } 704827bd09bSSatish Balay 705827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 706827bd09bSSatish Balay else 707827bd09bSSatish Balay { 708827bd09bSSatish Balay /* insertion sort for bottom */ 709827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 710827bd09bSSatish Balay { 711827bd09bSSatish Balay temp = *pj; 712827bd09bSSatish Balay ptr = *pj2; 713827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 714827bd09bSSatish Balay { 715827bd09bSSatish Balay if (*pi <= temp) break; 716827bd09bSSatish Balay *(pi+1)=*pi; 717827bd09bSSatish Balay *(pi2+1)=*pi2; 718827bd09bSSatish Balay } 719827bd09bSSatish Balay *(pi+1)=temp; 720827bd09bSSatish Balay *(pi2+1)=ptr; 721827bd09bSSatish Balay } 722827bd09bSSatish Balay 723827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 7243fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 725827bd09bSSatish Balay 726827bd09bSSatish Balay /* else pop another list from the stack */ 727827bd09bSSatish Balay ar2 = (int **)*(--top_a); 728827bd09bSSatish Balay ar = *(--top_a); 729827bd09bSSatish Balay size = *(--top_s); 730827bd09bSSatish Balay } 731827bd09bSSatish Balay } 7323fdc5746SBarry Smith PetscFunctionReturn(0); 733827bd09bSSatish Balay } 734827bd09bSSatish Balay 735827bd09bSSatish Balay 736827bd09bSSatish Balay 737827bd09bSSatish Balay /****************************************************************************** 738827bd09bSSatish Balay Function: SMI_sort(). 739827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 740827bd09bSSatish Balay Output: sorted list (in ascending order). 741827bd09bSSatish Balay Return: none. 742827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 743827bd09bSSatish Balay ******************************************************************************/ 7440924e98cSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, int size, int type) 745827bd09bSSatish Balay { 7463fdc5746SBarry Smith PetscFunctionBegin; 747827bd09bSSatish Balay if (type == SORT_INTEGER) 748827bd09bSSatish Balay { 749827bd09bSSatish Balay if (ar2) 750827bd09bSSatish Balay {ivec_sort_companion((int*)ar1,(int*)ar2,size);} 751827bd09bSSatish Balay else 752827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 753827bd09bSSatish Balay } 754827bd09bSSatish Balay else if (type == SORT_INT_PTR) 755827bd09bSSatish Balay { 756827bd09bSSatish Balay if (ar2) 757827bd09bSSatish Balay {ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);} 758827bd09bSSatish Balay else 759827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 760827bd09bSSatish Balay } 761827bd09bSSatish Balay 762827bd09bSSatish Balay else 763827bd09bSSatish Balay { 764827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 765827bd09bSSatish Balay } 7663fdc5746SBarry Smith PetscFunctionReturn(0); 767827bd09bSSatish Balay } 768827bd09bSSatish Balay 769827bd09bSSatish Balay 770827bd09bSSatish Balay 771827bd09bSSatish Balay /**********************************ivec.c************************************** 772827bd09bSSatish Balay Function ivec_linear_search() 773827bd09bSSatish Balay 774827bd09bSSatish Balay Input : 775827bd09bSSatish Balay Output: 776827bd09bSSatish Balay Return: 777827bd09bSSatish Balay Description: 778827bd09bSSatish Balay ***********************************ivec.c*************************************/ 779827bd09bSSatish Balay int 780a501084fSBarry Smith ivec_linear_search( int item, int *list, int n) 781827bd09bSSatish Balay { 782a501084fSBarry Smith int tmp = n-1; 7833fdc5746SBarry Smith PetscFunctionBegin; 784827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 785827bd09bSSatish Balay return(-1); 786827bd09bSSatish Balay } 787827bd09bSSatish Balay 788827bd09bSSatish Balay 789827bd09bSSatish Balay 790827bd09bSSatish Balay /**********************************ivec.c************************************** 791827bd09bSSatish Balay Function ivec_binary_search() 792827bd09bSSatish Balay 793827bd09bSSatish Balay Input : 794827bd09bSSatish Balay Output: 795827bd09bSSatish Balay Return: 796827bd09bSSatish Balay Description: 797827bd09bSSatish Balay ***********************************ivec.c*************************************/ 798827bd09bSSatish Balay int 799a501084fSBarry Smith ivec_binary_search( int item, int *list, int rh) 800827bd09bSSatish Balay { 801a501084fSBarry Smith int mid, lh=0; 802827bd09bSSatish Balay 803827bd09bSSatish Balay rh--; 804827bd09bSSatish Balay while (lh<=rh) 805827bd09bSSatish Balay { 806827bd09bSSatish Balay mid = (lh+rh)>>1; 807827bd09bSSatish Balay if (*(list+mid) == item) 808827bd09bSSatish Balay {return(mid);} 809827bd09bSSatish Balay if (*(list+mid) > item) 810827bd09bSSatish Balay {rh = mid-1;} 811827bd09bSSatish Balay else 812827bd09bSSatish Balay {lh = mid+1;} 813827bd09bSSatish Balay } 814827bd09bSSatish Balay return(-1); 815827bd09bSSatish Balay } 816827bd09bSSatish Balay 817827bd09bSSatish Balay 818827bd09bSSatish Balay /********************************ivec.c************************************** 819827bd09bSSatish Balay Function rvec_copy() 820827bd09bSSatish Balay 821827bd09bSSatish Balay Input : 822827bd09bSSatish Balay Output: 823827bd09bSSatish Balay Return: 824827bd09bSSatish Balay Description: 825827bd09bSSatish Balay *********************************ivec.c*************************************/ 8260924e98cSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1, PetscScalar *arg2, int n) 827827bd09bSSatish Balay { 8283fdc5746SBarry Smith PetscFunctionBegin; 829827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 8303fdc5746SBarry Smith PetscFunctionReturn(0); 831827bd09bSSatish Balay } 832827bd09bSSatish Balay 833827bd09bSSatish Balay 834827bd09bSSatish Balay 835827bd09bSSatish Balay /********************************ivec.c************************************** 836827bd09bSSatish Balay Function rvec_zero() 837827bd09bSSatish Balay 838827bd09bSSatish Balay Input : 839827bd09bSSatish Balay Output: 840827bd09bSSatish Balay Return: 841827bd09bSSatish Balay Description: 842827bd09bSSatish Balay *********************************ivec.c*************************************/ 8430924e98cSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1, int n) 844827bd09bSSatish Balay { 8453fdc5746SBarry Smith PetscFunctionBegin; 846827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 8473fdc5746SBarry Smith PetscFunctionReturn(0); 848827bd09bSSatish Balay } 849827bd09bSSatish Balay 850827bd09bSSatish Balay 851827bd09bSSatish Balay 852827bd09bSSatish Balay /**********************************ivec.c************************************** 853827bd09bSSatish Balay Function rvec_one() 854827bd09bSSatish Balay 855827bd09bSSatish Balay Input : 856827bd09bSSatish Balay Output: 857827bd09bSSatish Balay Return: 858827bd09bSSatish Balay Description: 859827bd09bSSatish Balay ***********************************ivec.c*************************************/ 8600924e98cSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1, int n) 861827bd09bSSatish Balay { 8623fdc5746SBarry Smith PetscFunctionBegin; 863827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 8643fdc5746SBarry Smith PetscFunctionReturn(0); 865827bd09bSSatish Balay } 866827bd09bSSatish Balay 867827bd09bSSatish Balay /**********************************ivec.c************************************** 868827bd09bSSatish Balay Function rvec_set() 869827bd09bSSatish Balay 870827bd09bSSatish Balay Input : 871827bd09bSSatish Balay Output: 872827bd09bSSatish Balay Return: 873827bd09bSSatish Balay Description: 874827bd09bSSatish Balay ***********************************ivec.c*************************************/ 8750924e98cSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1, PetscScalar arg2, int n) 876827bd09bSSatish Balay { 8773fdc5746SBarry Smith PetscFunctionBegin; 878827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 8793fdc5746SBarry Smith PetscFunctionReturn(0); 880827bd09bSSatish Balay } 881827bd09bSSatish Balay 882827bd09bSSatish Balay 883827bd09bSSatish Balay 884827bd09bSSatish Balay /**********************************ivec.c************************************** 885827bd09bSSatish Balay Function rvec_scale() 886827bd09bSSatish Balay 887827bd09bSSatish Balay Input : 888827bd09bSSatish Balay Output: 889827bd09bSSatish Balay Return: 890827bd09bSSatish Balay Description: 891827bd09bSSatish Balay ***********************************ivec.c*************************************/ 8920924e98cSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1, PetscScalar arg2, int n) 893827bd09bSSatish Balay { 8943fdc5746SBarry Smith PetscFunctionBegin; 895827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 8963fdc5746SBarry Smith PetscFunctionReturn(0); 897827bd09bSSatish Balay } 898827bd09bSSatish Balay 899827bd09bSSatish Balay 900827bd09bSSatish Balay 901827bd09bSSatish Balay /********************************ivec.c************************************** 902827bd09bSSatish Balay Function rvec_add() 903827bd09bSSatish Balay 904827bd09bSSatish Balay Input : 905827bd09bSSatish Balay Output: 906827bd09bSSatish Balay Return: 907827bd09bSSatish Balay Description: 908827bd09bSSatish Balay *********************************ivec.c*************************************/ 9090924e98cSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1, PetscScalar *arg2, int n) 910827bd09bSSatish Balay { 9113fdc5746SBarry Smith PetscFunctionBegin; 912827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 9133fdc5746SBarry Smith PetscFunctionReturn(0); 914827bd09bSSatish Balay } 915827bd09bSSatish Balay 916827bd09bSSatish Balay /********************************ivec.c************************************** 917827bd09bSSatish Balay Function rvec_mult() 918827bd09bSSatish Balay 919827bd09bSSatish Balay Input : 920827bd09bSSatish Balay Output: 921827bd09bSSatish Balay Return: 922827bd09bSSatish Balay Description: 923827bd09bSSatish Balay *********************************ivec.c*************************************/ 9240924e98cSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1, PetscScalar *arg2, int n) 925827bd09bSSatish Balay { 9263fdc5746SBarry Smith PetscFunctionBegin; 927827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 9283fdc5746SBarry Smith PetscFunctionReturn(0); 929827bd09bSSatish Balay } 930827bd09bSSatish Balay 931827bd09bSSatish Balay 932827bd09bSSatish Balay 933827bd09bSSatish Balay /********************************ivec.c************************************** 934827bd09bSSatish Balay Function rvec_max() 935827bd09bSSatish Balay 936827bd09bSSatish Balay Input : 937827bd09bSSatish Balay Output: 938827bd09bSSatish Balay Return: 939827bd09bSSatish Balay Description: 940827bd09bSSatish Balay *********************************ivec.c*************************************/ 9410924e98cSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1, PetscScalar *arg2, int n) 942827bd09bSSatish Balay { 9433fdc5746SBarry Smith PetscFunctionBegin; 94439945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 9453fdc5746SBarry Smith PetscFunctionReturn(0); 946827bd09bSSatish Balay } 947827bd09bSSatish Balay 948827bd09bSSatish Balay 949827bd09bSSatish Balay 950827bd09bSSatish Balay /********************************ivec.c************************************** 951827bd09bSSatish Balay Function rvec_max_abs() 952827bd09bSSatish Balay 953827bd09bSSatish Balay Input : 954827bd09bSSatish Balay Output: 955827bd09bSSatish Balay Return: 956827bd09bSSatish Balay Description: 957827bd09bSSatish Balay *********************************ivec.c*************************************/ 9580924e98cSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 959827bd09bSSatish Balay { 9603fdc5746SBarry Smith PetscFunctionBegin; 961827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 9623fdc5746SBarry Smith PetscFunctionReturn(0); 963827bd09bSSatish Balay } 964827bd09bSSatish Balay 965827bd09bSSatish Balay 966827bd09bSSatish Balay 967827bd09bSSatish Balay /********************************ivec.c************************************** 968827bd09bSSatish Balay Function rvec_min() 969827bd09bSSatish Balay 970827bd09bSSatish Balay Input : 971827bd09bSSatish Balay Output: 972827bd09bSSatish Balay Return: 973827bd09bSSatish Balay Description: 974827bd09bSSatish Balay *********************************ivec.c*************************************/ 9750924e98cSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1, PetscScalar *arg2, int n) 976827bd09bSSatish Balay { 9773fdc5746SBarry Smith PetscFunctionBegin; 97839945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 9793fdc5746SBarry Smith PetscFunctionReturn(0); 980827bd09bSSatish Balay } 981827bd09bSSatish Balay 982827bd09bSSatish Balay 983827bd09bSSatish Balay 984827bd09bSSatish Balay /********************************ivec.c************************************** 985827bd09bSSatish Balay Function rvec_min_abs() 986827bd09bSSatish Balay 987827bd09bSSatish Balay Input : 988827bd09bSSatish Balay Output: 989827bd09bSSatish Balay Return: 990827bd09bSSatish Balay Description: 991827bd09bSSatish Balay *********************************ivec.c*************************************/ 9920924e98cSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, int n) 993827bd09bSSatish Balay { 9943fdc5746SBarry Smith PetscFunctionBegin; 995827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 9963fdc5746SBarry Smith PetscFunctionReturn(0); 997827bd09bSSatish Balay } 998827bd09bSSatish Balay 999827bd09bSSatish Balay 1000827bd09bSSatish Balay 1001827bd09bSSatish Balay /********************************ivec.c************************************** 1002827bd09bSSatish Balay Function rvec_exists() 1003827bd09bSSatish Balay 1004827bd09bSSatish Balay Input : 1005827bd09bSSatish Balay Output: 1006827bd09bSSatish Balay Return: 1007827bd09bSSatish Balay Description: 1008827bd09bSSatish Balay *********************************ivec.c*************************************/ 10090924e98cSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1, PetscScalar *arg2, int n) 1010827bd09bSSatish Balay { 10113fdc5746SBarry Smith PetscFunctionBegin; 1012827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 10133fdc5746SBarry Smith PetscFunctionReturn(0); 1014827bd09bSSatish Balay } 1015827bd09bSSatish Balay 1016827bd09bSSatish Balay 1017827bd09bSSatish Balay 1018827bd09bSSatish Balay /**********************************ivec.c************************************** 1019827bd09bSSatish Balay Function rvec_non_uniform() 1020827bd09bSSatish Balay 1021827bd09bSSatish Balay Input : 1022827bd09bSSatish Balay Output: 1023827bd09bSSatish Balay Return: 1024827bd09bSSatish Balay Description: 1025827bd09bSSatish Balay ***********************************ivec.c*************************************/ 10260924e98cSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, int n, int *arg3) 1027827bd09bSSatish Balay { 1028a501084fSBarry Smith int i, j, type; 1029827bd09bSSatish Balay 10303fdc5746SBarry Smith PetscFunctionBegin; 1031827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1032827bd09bSSatish Balay for (i=0;i<n;) 1033827bd09bSSatish Balay { 1034827bd09bSSatish Balay /* clump 'em for now */ 1035827bd09bSSatish Balay j=i+1; 1036827bd09bSSatish Balay type = arg3[i]; 1037827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1038827bd09bSSatish Balay {j++;} 1039827bd09bSSatish Balay 1040827bd09bSSatish Balay /* how many together */ 1041827bd09bSSatish Balay j -= i; 1042827bd09bSSatish Balay 1043827bd09bSSatish Balay /* call appropriate ivec function */ 1044827bd09bSSatish Balay if (type == GL_MAX) 1045827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1046827bd09bSSatish Balay else if (type == GL_MIN) 1047827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1048827bd09bSSatish Balay else if (type == GL_MULT) 1049827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1050827bd09bSSatish Balay else if (type == GL_ADD) 1051827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1052827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1053827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1054827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1055827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1056827bd09bSSatish Balay else if (type == GL_EXISTS) 1057827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1058827bd09bSSatish Balay else 1059827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1060827bd09bSSatish Balay 1061827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1062827bd09bSSatish Balay } 10633fdc5746SBarry Smith PetscFunctionReturn(0); 1064827bd09bSSatish Balay } 1065827bd09bSSatish Balay 1066827bd09bSSatish Balay 1067827bd09bSSatish Balay 1068827bd09bSSatish Balay /**********************************ivec.c************************************** 1069827bd09bSSatish Balay Function rvec_fct_addr() 1070827bd09bSSatish Balay 1071827bd09bSSatish Balay Input : 1072827bd09bSSatish Balay Output: 1073827bd09bSSatish Balay Return: 1074827bd09bSSatish Balay Description: 1075827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1076a501084fSBarry Smith vfp rvec_fct_addr( int type) 1077827bd09bSSatish Balay { 1078827bd09bSSatish Balay if (type == NON_UNIFORM) 10793fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);} 1080827bd09bSSatish Balay else if (type == GL_MAX) 10813fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);} 1082827bd09bSSatish Balay else if (type == GL_MIN) 10833fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);} 1084827bd09bSSatish Balay else if (type == GL_MULT) 10853fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);} 1086827bd09bSSatish Balay else if (type == GL_ADD) 10873fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);} 1088827bd09bSSatish Balay else if (type == GL_MAX_ABS) 10893fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);} 1090827bd09bSSatish Balay else if (type == GL_MIN_ABS) 10913fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);} 1092827bd09bSSatish Balay else if (type == GL_EXISTS) 10933fdc5746SBarry Smith {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);} 1094827bd09bSSatish Balay 1095827bd09bSSatish Balay /* catch all ... not good if we get here */ 1096827bd09bSSatish Balay return(NULL); 1097827bd09bSSatish Balay } 1098827bd09bSSatish Balay 1099827bd09bSSatish Balay 1100827bd09bSSatish Balay 1101827bd09bSSatish Balay 1102827bd09bSSatish Balay 1103827bd09bSSatish Balay 1104