1*827bd09bSSatish Balay 2*827bd09bSSatish Balay /**********************************ivec.c************************************** 3*827bd09bSSatish Balay SPARSE GATHER-SCATTER PACKAGE: bss_malloc bss_malloc ivec error comm gs queue 4*827bd09bSSatish Balay 5*827bd09bSSatish Balay Author: Henry M. Tufo III 6*827bd09bSSatish Balay 7*827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 8*827bd09bSSatish Balay 9*827bd09bSSatish Balay snail-mail: 10*827bd09bSSatish Balay Division of Applied Mathematics 11*827bd09bSSatish Balay Brown University 12*827bd09bSSatish Balay Providence, RI 02912 13*827bd09bSSatish Balay 14*827bd09bSSatish Balay Last Modification: 15*827bd09bSSatish Balay 6.21.97 16*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 17*827bd09bSSatish Balay 18*827bd09bSSatish Balay /**********************************ivec.c************************************** 19*827bd09bSSatish Balay File Description: 20*827bd09bSSatish Balay ----------------- 21*827bd09bSSatish Balay 22*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 23*827bd09bSSatish Balay #include <stdio.h> 24*827bd09bSSatish Balay #include <math.h> 25*827bd09bSSatish Balay #include <float.h> 26*827bd09bSSatish Balay #include <limits.h> 27*827bd09bSSatish Balay 28*827bd09bSSatish Balay #ifdef MPISRC 29*827bd09bSSatish Balay #include <mpi.h> 30*827bd09bSSatish Balay #endif 31*827bd09bSSatish Balay 32*827bd09bSSatish Balay 33*827bd09bSSatish Balay #include "const.h" 34*827bd09bSSatish Balay #include "types.h" 35*827bd09bSSatish Balay #include "ivec.h" 36*827bd09bSSatish Balay #include "error.h" 37*827bd09bSSatish Balay #include "comm.h" 38*827bd09bSSatish Balay 39*827bd09bSSatish Balay 40*827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 41*827bd09bSSatish Balay #define SORT_OPT 6 42*827bd09bSSatish Balay #define SORT_STACK 50000 43*827bd09bSSatish Balay 44*827bd09bSSatish Balay 45*827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 46*827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 47*827bd09bSSatish Balay static int size_stack[SORT_STACK]; 48*827bd09bSSatish Balay static PTRINT psize_stack[SORT_STACK]; 49*827bd09bSSatish Balay 50*827bd09bSSatish Balay 51*827bd09bSSatish Balay 52*827bd09bSSatish Balay /**********************************ivec.c************************************** 53*827bd09bSSatish Balay Function ivec_dump() 54*827bd09bSSatish Balay 55*827bd09bSSatish Balay Input : 56*827bd09bSSatish Balay Output: 57*827bd09bSSatish Balay Return: 58*827bd09bSSatish Balay Description: 59*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 60*827bd09bSSatish Balay void 61*827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s) 62*827bd09bSSatish Balay { 63*827bd09bSSatish Balay int i; 64*827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 65*827bd09bSSatish Balay for (i=0;i<n;i++) 66*827bd09bSSatish Balay {printf("%2d ",v[i]);} 67*827bd09bSSatish Balay printf("\n"); 68*827bd09bSSatish Balay fflush(stdout); 69*827bd09bSSatish Balay } 70*827bd09bSSatish Balay 71*827bd09bSSatish Balay 72*827bd09bSSatish Balay 73*827bd09bSSatish Balay /**********************************ivec.c************************************** 74*827bd09bSSatish Balay Function ivec_lb_ub() 75*827bd09bSSatish Balay 76*827bd09bSSatish Balay Input : 77*827bd09bSSatish Balay Output: 78*827bd09bSSatish Balay Return: 79*827bd09bSSatish Balay Description: 80*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 81*827bd09bSSatish Balay void 82*827bd09bSSatish Balay ivec_lb_ub(register int *arg1, register int n, int *lb, int *ub) 83*827bd09bSSatish Balay { 84*827bd09bSSatish Balay register int min = INT_MAX; 85*827bd09bSSatish Balay register int max = INT_MIN; 86*827bd09bSSatish Balay 87*827bd09bSSatish Balay while (n--) 88*827bd09bSSatish Balay { 89*827bd09bSSatish Balay min = MIN(min,*arg1); 90*827bd09bSSatish Balay max = MAX(max,*arg1); 91*827bd09bSSatish Balay arg1++; 92*827bd09bSSatish Balay } 93*827bd09bSSatish Balay 94*827bd09bSSatish Balay *lb=min; 95*827bd09bSSatish Balay *ub=max; 96*827bd09bSSatish Balay } 97*827bd09bSSatish Balay 98*827bd09bSSatish Balay 99*827bd09bSSatish Balay 100*827bd09bSSatish Balay /**********************************ivec.c************************************** 101*827bd09bSSatish Balay Function ivec_copy() 102*827bd09bSSatish Balay 103*827bd09bSSatish Balay Input : 104*827bd09bSSatish Balay Output: 105*827bd09bSSatish Balay Return: 106*827bd09bSSatish Balay Description: 107*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 108*827bd09bSSatish Balay int * 109*827bd09bSSatish Balay ivec_copy(register int *arg1, register int *arg2, register int n) 110*827bd09bSSatish Balay { 111*827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 112*827bd09bSSatish Balay return(arg1); 113*827bd09bSSatish Balay } 114*827bd09bSSatish Balay 115*827bd09bSSatish Balay 116*827bd09bSSatish Balay 117*827bd09bSSatish Balay /**********************************ivec.c************************************** 118*827bd09bSSatish Balay Function ivec_zero() 119*827bd09bSSatish Balay 120*827bd09bSSatish Balay Input : 121*827bd09bSSatish Balay Output: 122*827bd09bSSatish Balay Return: 123*827bd09bSSatish Balay Description: 124*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 125*827bd09bSSatish Balay void 126*827bd09bSSatish Balay ivec_zero(register int *arg1, register int n) 127*827bd09bSSatish Balay { 128*827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 129*827bd09bSSatish Balay } 130*827bd09bSSatish Balay 131*827bd09bSSatish Balay 132*827bd09bSSatish Balay 133*827bd09bSSatish Balay /**********************************ivec.c************************************** 134*827bd09bSSatish Balay Function ivec_comp() 135*827bd09bSSatish Balay 136*827bd09bSSatish Balay Input : 137*827bd09bSSatish Balay Output: 138*827bd09bSSatish Balay Return: 139*827bd09bSSatish Balay Description: 140*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 141*827bd09bSSatish Balay void 142*827bd09bSSatish Balay ivec_comp(register int *arg1, register int n) 143*827bd09bSSatish Balay { 144*827bd09bSSatish Balay while (n--) {*arg1 = ~*arg1; arg1++;} 145*827bd09bSSatish Balay } 146*827bd09bSSatish Balay 147*827bd09bSSatish Balay 148*827bd09bSSatish Balay 149*827bd09bSSatish Balay /**********************************ivec.c************************************** 150*827bd09bSSatish Balay Function ivec_neg_one() 151*827bd09bSSatish Balay 152*827bd09bSSatish Balay Input : 153*827bd09bSSatish Balay Output: 154*827bd09bSSatish Balay Return: 155*827bd09bSSatish Balay Description: 156*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 157*827bd09bSSatish Balay void 158*827bd09bSSatish Balay ivec_neg_one(register int *arg1, register int n) 159*827bd09bSSatish Balay { 160*827bd09bSSatish Balay while (n--) {*arg1++ = -1;} 161*827bd09bSSatish Balay } 162*827bd09bSSatish Balay 163*827bd09bSSatish Balay 164*827bd09bSSatish Balay 165*827bd09bSSatish Balay /**********************************ivec.c************************************** 166*827bd09bSSatish Balay Function ivec_pos_one() 167*827bd09bSSatish Balay 168*827bd09bSSatish Balay Input : 169*827bd09bSSatish Balay Output: 170*827bd09bSSatish Balay Return: 171*827bd09bSSatish Balay Description: 172*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 173*827bd09bSSatish Balay void 174*827bd09bSSatish Balay ivec_pos_one(register int *arg1, register int n) 175*827bd09bSSatish Balay { 176*827bd09bSSatish Balay while (n--) {*arg1++ = 1;} 177*827bd09bSSatish Balay } 178*827bd09bSSatish Balay 179*827bd09bSSatish Balay 180*827bd09bSSatish Balay 181*827bd09bSSatish Balay /**********************************ivec.c************************************** 182*827bd09bSSatish Balay Function ivec_c_index() 183*827bd09bSSatish Balay 184*827bd09bSSatish Balay Input : 185*827bd09bSSatish Balay Output: 186*827bd09bSSatish Balay Return: 187*827bd09bSSatish Balay Description: 188*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 189*827bd09bSSatish Balay void 190*827bd09bSSatish Balay ivec_c_index(register int *arg1, register int n) 191*827bd09bSSatish Balay { 192*827bd09bSSatish Balay register int i=0; 193*827bd09bSSatish Balay 194*827bd09bSSatish Balay 195*827bd09bSSatish Balay while (n--) {*arg1++ = i++;} 196*827bd09bSSatish Balay } 197*827bd09bSSatish Balay 198*827bd09bSSatish Balay 199*827bd09bSSatish Balay 200*827bd09bSSatish Balay /**********************************ivec.c************************************** 201*827bd09bSSatish Balay Function ivec_fortran_index() 202*827bd09bSSatish Balay 203*827bd09bSSatish Balay Input : 204*827bd09bSSatish Balay Output: 205*827bd09bSSatish Balay Return: 206*827bd09bSSatish Balay Description: 207*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 208*827bd09bSSatish Balay void 209*827bd09bSSatish Balay ivec_fortran_index(register int *arg1, register int n) 210*827bd09bSSatish Balay { 211*827bd09bSSatish Balay register int i=0; 212*827bd09bSSatish Balay 213*827bd09bSSatish Balay 214*827bd09bSSatish Balay while (n--) {*arg1++ = ++i;} 215*827bd09bSSatish Balay } 216*827bd09bSSatish Balay 217*827bd09bSSatish Balay 218*827bd09bSSatish Balay 219*827bd09bSSatish Balay /**********************************ivec.c************************************** 220*827bd09bSSatish Balay Function ivec_set() 221*827bd09bSSatish Balay 222*827bd09bSSatish Balay Input : 223*827bd09bSSatish Balay Output: 224*827bd09bSSatish Balay Return: 225*827bd09bSSatish Balay Description: 226*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 227*827bd09bSSatish Balay void 228*827bd09bSSatish Balay ivec_set(register int *arg1, register int arg2, register int n) 229*827bd09bSSatish Balay { 230*827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 231*827bd09bSSatish Balay } 232*827bd09bSSatish Balay 233*827bd09bSSatish Balay 234*827bd09bSSatish Balay 235*827bd09bSSatish Balay /**********************************ivec.c************************************** 236*827bd09bSSatish Balay Function ivec_cmp() 237*827bd09bSSatish Balay 238*827bd09bSSatish Balay Input : 239*827bd09bSSatish Balay Output: 240*827bd09bSSatish Balay Return: 241*827bd09bSSatish Balay Description: 242*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 243*827bd09bSSatish Balay int 244*827bd09bSSatish Balay ivec_cmp(register int *arg1, register int *arg2, register int n) 245*827bd09bSSatish Balay { 246*827bd09bSSatish Balay while (n--) {if (*arg1++ != *arg2++) {return(FALSE);}} 247*827bd09bSSatish Balay return(TRUE); 248*827bd09bSSatish Balay } 249*827bd09bSSatish Balay 250*827bd09bSSatish Balay 251*827bd09bSSatish Balay 252*827bd09bSSatish Balay /**********************************ivec.c************************************** 253*827bd09bSSatish Balay Function ivec_max() 254*827bd09bSSatish Balay 255*827bd09bSSatish Balay Input : 256*827bd09bSSatish Balay Output: 257*827bd09bSSatish Balay Return: 258*827bd09bSSatish Balay Description: 259*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 260*827bd09bSSatish Balay void 261*827bd09bSSatish Balay ivec_max(register int *arg1, register int *arg2, register int n) 262*827bd09bSSatish Balay { 263*827bd09bSSatish Balay while (n--) {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;} 264*827bd09bSSatish Balay } 265*827bd09bSSatish Balay 266*827bd09bSSatish Balay 267*827bd09bSSatish Balay 268*827bd09bSSatish Balay /**********************************ivec.c************************************** 269*827bd09bSSatish Balay Function ivec_min() 270*827bd09bSSatish Balay 271*827bd09bSSatish Balay Input : 272*827bd09bSSatish Balay Output: 273*827bd09bSSatish Balay Return: 274*827bd09bSSatish Balay Description: 275*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 276*827bd09bSSatish Balay void 277*827bd09bSSatish Balay ivec_min(register int *arg1, register int *arg2, register int n) 278*827bd09bSSatish Balay { 279*827bd09bSSatish Balay while (n--) {*(arg1) = MIN(*arg1,*arg2); arg1++; arg2++;} 280*827bd09bSSatish Balay } 281*827bd09bSSatish Balay 282*827bd09bSSatish Balay 283*827bd09bSSatish Balay 284*827bd09bSSatish Balay /**********************************ivec.c************************************** 285*827bd09bSSatish Balay Function ivec_mult() 286*827bd09bSSatish Balay 287*827bd09bSSatish Balay Input : 288*827bd09bSSatish Balay Output: 289*827bd09bSSatish Balay Return: 290*827bd09bSSatish Balay Description: 291*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 292*827bd09bSSatish Balay void 293*827bd09bSSatish Balay ivec_mult(register int *arg1, register int *arg2, register int n) 294*827bd09bSSatish Balay { 295*827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 296*827bd09bSSatish Balay } 297*827bd09bSSatish Balay 298*827bd09bSSatish Balay 299*827bd09bSSatish Balay 300*827bd09bSSatish Balay /**********************************ivec.c************************************** 301*827bd09bSSatish Balay Function ivec_add() 302*827bd09bSSatish Balay 303*827bd09bSSatish Balay Input : 304*827bd09bSSatish Balay Output: 305*827bd09bSSatish Balay Return: 306*827bd09bSSatish Balay Description: 307*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 308*827bd09bSSatish Balay void 309*827bd09bSSatish Balay ivec_add(register int *arg1, register int *arg2, register int n) 310*827bd09bSSatish Balay { 311*827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 312*827bd09bSSatish Balay } 313*827bd09bSSatish Balay 314*827bd09bSSatish Balay 315*827bd09bSSatish Balay 316*827bd09bSSatish Balay /**********************************ivec.c************************************** 317*827bd09bSSatish Balay Function ivec_lxor() 318*827bd09bSSatish Balay 319*827bd09bSSatish Balay Input : 320*827bd09bSSatish Balay Output: 321*827bd09bSSatish Balay Return: 322*827bd09bSSatish Balay Description: 323*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 324*827bd09bSSatish Balay void 325*827bd09bSSatish Balay ivec_lxor(register int *arg1, register int *arg2, register int n) 326*827bd09bSSatish Balay { 327*827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)) ; arg1++; arg2++;} 328*827bd09bSSatish Balay } 329*827bd09bSSatish Balay 330*827bd09bSSatish Balay 331*827bd09bSSatish Balay 332*827bd09bSSatish Balay /**********************************ivec.c************************************** 333*827bd09bSSatish Balay Function ivec_xor() 334*827bd09bSSatish Balay 335*827bd09bSSatish Balay Input : 336*827bd09bSSatish Balay Output: 337*827bd09bSSatish Balay Return: 338*827bd09bSSatish Balay Description: 339*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 340*827bd09bSSatish Balay void 341*827bd09bSSatish Balay ivec_xor(register int *arg1, register int *arg2, register int n) 342*827bd09bSSatish Balay { 343*827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 344*827bd09bSSatish Balay } 345*827bd09bSSatish Balay 346*827bd09bSSatish Balay 347*827bd09bSSatish Balay 348*827bd09bSSatish Balay /**********************************ivec.c************************************** 349*827bd09bSSatish Balay Function ivec_or() 350*827bd09bSSatish Balay 351*827bd09bSSatish Balay Input : 352*827bd09bSSatish Balay Output: 353*827bd09bSSatish Balay Return: 354*827bd09bSSatish Balay Description: 355*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 356*827bd09bSSatish Balay void 357*827bd09bSSatish Balay ivec_or(register int *arg1, register int *arg2, register int n) 358*827bd09bSSatish Balay { 359*827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 360*827bd09bSSatish Balay } 361*827bd09bSSatish Balay 362*827bd09bSSatish Balay 363*827bd09bSSatish Balay 364*827bd09bSSatish Balay /**********************************ivec.c************************************** 365*827bd09bSSatish Balay Function ivec_lor() 366*827bd09bSSatish Balay 367*827bd09bSSatish Balay Input : 368*827bd09bSSatish Balay Output: 369*827bd09bSSatish Balay Return: 370*827bd09bSSatish Balay Description: 371*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 372*827bd09bSSatish Balay void 373*827bd09bSSatish Balay ivec_lor(register int *arg1, register int *arg2, register int n) 374*827bd09bSSatish Balay { 375*827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 376*827bd09bSSatish Balay } 377*827bd09bSSatish Balay 378*827bd09bSSatish Balay 379*827bd09bSSatish Balay 380*827bd09bSSatish Balay /**********************************ivec.c************************************** 381*827bd09bSSatish Balay Function ivec_or3() 382*827bd09bSSatish Balay 383*827bd09bSSatish Balay Input : 384*827bd09bSSatish Balay Output: 385*827bd09bSSatish Balay Return: 386*827bd09bSSatish Balay Description: 387*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 388*827bd09bSSatish Balay void 389*827bd09bSSatish Balay ivec_or3(register int *arg1, register int *arg2, register int *arg3, 390*827bd09bSSatish Balay register int n) 391*827bd09bSSatish Balay { 392*827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ | *arg3++);} 393*827bd09bSSatish Balay } 394*827bd09bSSatish Balay 395*827bd09bSSatish Balay 396*827bd09bSSatish Balay 397*827bd09bSSatish Balay /**********************************ivec.c************************************** 398*827bd09bSSatish Balay Function ivec_and() 399*827bd09bSSatish Balay 400*827bd09bSSatish Balay Input : 401*827bd09bSSatish Balay Output: 402*827bd09bSSatish Balay Return: 403*827bd09bSSatish Balay Description: 404*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 405*827bd09bSSatish Balay void 406*827bd09bSSatish Balay ivec_and(register int *arg1, register int *arg2, register int n) 407*827bd09bSSatish Balay { 408*827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 409*827bd09bSSatish Balay } 410*827bd09bSSatish Balay 411*827bd09bSSatish Balay 412*827bd09bSSatish Balay 413*827bd09bSSatish Balay /**********************************ivec.c************************************** 414*827bd09bSSatish Balay Function ivec_land() 415*827bd09bSSatish Balay 416*827bd09bSSatish Balay Input : 417*827bd09bSSatish Balay Output: 418*827bd09bSSatish Balay Return: 419*827bd09bSSatish Balay Description: 420*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 421*827bd09bSSatish Balay void 422*827bd09bSSatish Balay ivec_land(register int *arg1, register int *arg2, register int n) 423*827bd09bSSatish Balay { 424*827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 425*827bd09bSSatish Balay } 426*827bd09bSSatish Balay 427*827bd09bSSatish Balay 428*827bd09bSSatish Balay 429*827bd09bSSatish Balay /**********************************ivec.c************************************** 430*827bd09bSSatish Balay Function ivec_and3() 431*827bd09bSSatish Balay 432*827bd09bSSatish Balay Input : 433*827bd09bSSatish Balay Output: 434*827bd09bSSatish Balay Return: 435*827bd09bSSatish Balay Description: 436*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 437*827bd09bSSatish Balay void 438*827bd09bSSatish Balay ivec_and3(register int *arg1, register int *arg2, register int *arg3, 439*827bd09bSSatish Balay register int n) 440*827bd09bSSatish Balay { 441*827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 442*827bd09bSSatish Balay } 443*827bd09bSSatish Balay 444*827bd09bSSatish Balay 445*827bd09bSSatish Balay 446*827bd09bSSatish Balay /**********************************ivec.c************************************** 447*827bd09bSSatish Balay Function ivec_sum 448*827bd09bSSatish Balay 449*827bd09bSSatish Balay Input : 450*827bd09bSSatish Balay Output: 451*827bd09bSSatish Balay Return: 452*827bd09bSSatish Balay Description: 453*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 454*827bd09bSSatish Balay int 455*827bd09bSSatish Balay ivec_sum(register int *arg1, register int n) 456*827bd09bSSatish Balay { 457*827bd09bSSatish Balay register int tmp = 0; 458*827bd09bSSatish Balay 459*827bd09bSSatish Balay 460*827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 461*827bd09bSSatish Balay return(tmp); 462*827bd09bSSatish Balay } 463*827bd09bSSatish Balay 464*827bd09bSSatish Balay 465*827bd09bSSatish Balay 466*827bd09bSSatish Balay /**********************************ivec.c************************************** 467*827bd09bSSatish Balay Function ivec_reduce_and 468*827bd09bSSatish Balay 469*827bd09bSSatish Balay Input : 470*827bd09bSSatish Balay Output: 471*827bd09bSSatish Balay Return: 472*827bd09bSSatish Balay Description: 473*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 474*827bd09bSSatish Balay int 475*827bd09bSSatish Balay ivec_reduce_and(register int *arg1, register int n) 476*827bd09bSSatish Balay { 477*827bd09bSSatish Balay register int tmp = ALL_ONES; 478*827bd09bSSatish Balay 479*827bd09bSSatish Balay 480*827bd09bSSatish Balay while (n--) {tmp &= *arg1++;} 481*827bd09bSSatish Balay return(tmp); 482*827bd09bSSatish Balay } 483*827bd09bSSatish Balay 484*827bd09bSSatish Balay 485*827bd09bSSatish Balay 486*827bd09bSSatish Balay /**********************************ivec.c************************************** 487*827bd09bSSatish Balay Function ivec_reduce_or 488*827bd09bSSatish Balay 489*827bd09bSSatish Balay Input : 490*827bd09bSSatish Balay Output: 491*827bd09bSSatish Balay Return: 492*827bd09bSSatish Balay Description: 493*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 494*827bd09bSSatish Balay int 495*827bd09bSSatish Balay ivec_reduce_or(register int *arg1, register int n) 496*827bd09bSSatish Balay { 497*827bd09bSSatish Balay register int tmp = 0; 498*827bd09bSSatish Balay 499*827bd09bSSatish Balay 500*827bd09bSSatish Balay while (n--) {tmp |= *arg1++;} 501*827bd09bSSatish Balay return(tmp); 502*827bd09bSSatish Balay } 503*827bd09bSSatish Balay 504*827bd09bSSatish Balay 505*827bd09bSSatish Balay 506*827bd09bSSatish Balay /**********************************ivec.c************************************** 507*827bd09bSSatish Balay Function ivec_prod 508*827bd09bSSatish Balay 509*827bd09bSSatish Balay Input : 510*827bd09bSSatish Balay Output: 511*827bd09bSSatish Balay Return: 512*827bd09bSSatish Balay Description: 513*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 514*827bd09bSSatish Balay int 515*827bd09bSSatish Balay ivec_prod(register int *arg1, register int n) 516*827bd09bSSatish Balay { 517*827bd09bSSatish Balay register int tmp = 1; 518*827bd09bSSatish Balay 519*827bd09bSSatish Balay 520*827bd09bSSatish Balay while (n--) {tmp *= *arg1++;} 521*827bd09bSSatish Balay return(tmp); 522*827bd09bSSatish Balay } 523*827bd09bSSatish Balay 524*827bd09bSSatish Balay 525*827bd09bSSatish Balay 526*827bd09bSSatish Balay /**********************************ivec.c************************************** 527*827bd09bSSatish Balay Function ivec_u_sum 528*827bd09bSSatish Balay 529*827bd09bSSatish Balay Input : 530*827bd09bSSatish Balay Output: 531*827bd09bSSatish Balay Return: 532*827bd09bSSatish Balay Description: 533*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 534*827bd09bSSatish Balay int 535*827bd09bSSatish Balay ivec_u_sum(register unsigned *arg1, register int n) 536*827bd09bSSatish Balay { 537*827bd09bSSatish Balay register unsigned tmp = 0; 538*827bd09bSSatish Balay 539*827bd09bSSatish Balay 540*827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 541*827bd09bSSatish Balay return(tmp); 542*827bd09bSSatish Balay } 543*827bd09bSSatish Balay 544*827bd09bSSatish Balay 545*827bd09bSSatish Balay 546*827bd09bSSatish Balay /**********************************ivec.c************************************** 547*827bd09bSSatish Balay Function ivec_lb() 548*827bd09bSSatish Balay 549*827bd09bSSatish Balay Input : 550*827bd09bSSatish Balay Output: 551*827bd09bSSatish Balay Return: 552*827bd09bSSatish Balay Description: 553*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 554*827bd09bSSatish Balay int 555*827bd09bSSatish Balay ivec_lb(register int *arg1, register int n) 556*827bd09bSSatish Balay { 557*827bd09bSSatish Balay register int min = INT_MAX; 558*827bd09bSSatish Balay 559*827bd09bSSatish Balay 560*827bd09bSSatish Balay while (n--) {min = MIN(min,*arg1); arg1++;} 561*827bd09bSSatish Balay return(min); 562*827bd09bSSatish Balay } 563*827bd09bSSatish Balay 564*827bd09bSSatish Balay 565*827bd09bSSatish Balay 566*827bd09bSSatish Balay /**********************************ivec.c************************************** 567*827bd09bSSatish Balay Function ivec_ub() 568*827bd09bSSatish Balay 569*827bd09bSSatish Balay Input : 570*827bd09bSSatish Balay Output: 571*827bd09bSSatish Balay Return: 572*827bd09bSSatish Balay Description: 573*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 574*827bd09bSSatish Balay int 575*827bd09bSSatish Balay ivec_ub(register int *arg1, register int n) 576*827bd09bSSatish Balay { 577*827bd09bSSatish Balay register int max = INT_MIN; 578*827bd09bSSatish Balay 579*827bd09bSSatish Balay 580*827bd09bSSatish Balay while (n--) {max = MAX(max,*arg1); arg1++;} 581*827bd09bSSatish Balay return(max); 582*827bd09bSSatish Balay } 583*827bd09bSSatish Balay 584*827bd09bSSatish Balay 585*827bd09bSSatish Balay 586*827bd09bSSatish Balay /**********************************ivec.c************************************** 587*827bd09bSSatish Balay Function split_buf() 588*827bd09bSSatish Balay 589*827bd09bSSatish Balay Input : 590*827bd09bSSatish Balay Output: 591*827bd09bSSatish Balay Return: 592*827bd09bSSatish Balay Description: 593*827bd09bSSatish Balay 594*827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!! 595*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 596*827bd09bSSatish Balay int 597*827bd09bSSatish Balay ivec_split_buf(int *buf1, int **buf2, register int size) 598*827bd09bSSatish Balay { 599*827bd09bSSatish Balay *buf2 = (buf1 + (size>>3)); 600*827bd09bSSatish Balay return(size); 601*827bd09bSSatish Balay } 602*827bd09bSSatish Balay 603*827bd09bSSatish Balay 604*827bd09bSSatish Balay 605*827bd09bSSatish Balay /**********************************ivec.c************************************** 606*827bd09bSSatish Balay Function ivec_non_uniform() 607*827bd09bSSatish Balay 608*827bd09bSSatish Balay Input : 609*827bd09bSSatish Balay Output: 610*827bd09bSSatish Balay Return: 611*827bd09bSSatish Balay Description: 612*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 613*827bd09bSSatish Balay void 614*827bd09bSSatish Balay ivec_non_uniform(int *arg1, int *arg2, register int n, register int *arg3) 615*827bd09bSSatish Balay { 616*827bd09bSSatish Balay register int i, j, type; 617*827bd09bSSatish Balay 618*827bd09bSSatish Balay 619*827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 620*827bd09bSSatish Balay for (i=0;i<n;) 621*827bd09bSSatish Balay { 622*827bd09bSSatish Balay /* clump 'em for now */ 623*827bd09bSSatish Balay j=i+1; 624*827bd09bSSatish Balay type = arg3[i]; 625*827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 626*827bd09bSSatish Balay {j++;} 627*827bd09bSSatish Balay 628*827bd09bSSatish Balay /* how many together */ 629*827bd09bSSatish Balay j -= i; 630*827bd09bSSatish Balay 631*827bd09bSSatish Balay /* call appropriate ivec function */ 632*827bd09bSSatish Balay if (type == GL_MAX) 633*827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 634*827bd09bSSatish Balay else if (type == GL_MIN) 635*827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 636*827bd09bSSatish Balay else if (type == GL_MULT) 637*827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 638*827bd09bSSatish Balay else if (type == GL_ADD) 639*827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 640*827bd09bSSatish Balay else if (type == GL_B_XOR) 641*827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 642*827bd09bSSatish Balay else if (type == GL_B_OR) 643*827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 644*827bd09bSSatish Balay else if (type == GL_B_AND) 645*827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 646*827bd09bSSatish Balay else if (type == GL_L_XOR) 647*827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 648*827bd09bSSatish Balay else if (type == GL_L_OR) 649*827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 650*827bd09bSSatish Balay else if (type == GL_L_AND) 651*827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 652*827bd09bSSatish Balay else 653*827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");} 654*827bd09bSSatish Balay 655*827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 656*827bd09bSSatish Balay } 657*827bd09bSSatish Balay } 658*827bd09bSSatish Balay 659*827bd09bSSatish Balay 660*827bd09bSSatish Balay 661*827bd09bSSatish Balay /**********************************ivec.c************************************** 662*827bd09bSSatish Balay Function ivec_addr() 663*827bd09bSSatish Balay 664*827bd09bSSatish Balay Input : 665*827bd09bSSatish Balay Output: 666*827bd09bSSatish Balay Return: 667*827bd09bSSatish Balay Description: 668*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 669*827bd09bSSatish Balay vfp ivec_fct_addr(register int type) 670*827bd09bSSatish Balay { 671*827bd09bSSatish Balay if (type == NON_UNIFORM) 672*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_non_uniform);} 673*827bd09bSSatish Balay else if (type == GL_MAX) 674*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_max);} 675*827bd09bSSatish Balay else if (type == GL_MIN) 676*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_min);} 677*827bd09bSSatish Balay else if (type == GL_MULT) 678*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_mult);} 679*827bd09bSSatish Balay else if (type == GL_ADD) 680*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_add);} 681*827bd09bSSatish Balay else if (type == GL_B_XOR) 682*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_xor);} 683*827bd09bSSatish Balay else if (type == GL_B_OR) 684*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_or);} 685*827bd09bSSatish Balay else if (type == GL_B_AND) 686*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_and);} 687*827bd09bSSatish Balay else if (type == GL_L_XOR) 688*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_lxor);} 689*827bd09bSSatish Balay else if (type == GL_L_OR) 690*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_lor);} 691*827bd09bSSatish Balay else if (type == GL_L_AND) 692*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&ivec_land);} 693*827bd09bSSatish Balay 694*827bd09bSSatish Balay /* catch all ... not good if we get here */ 695*827bd09bSSatish Balay return(NULL); 696*827bd09bSSatish Balay } 697*827bd09bSSatish Balay 698*827bd09bSSatish Balay 699*827bd09bSSatish Balay /**********************************ivec.c************************************** 700*827bd09bSSatish Balay Function ct_bits() 701*827bd09bSSatish Balay 702*827bd09bSSatish Balay Input : 703*827bd09bSSatish Balay Output: 704*827bd09bSSatish Balay Return: 705*827bd09bSSatish Balay Description: MUST FIX THIS!!! 706*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 707*827bd09bSSatish Balay #if defined(notusing) 708*827bd09bSSatish Balay static 709*827bd09bSSatish Balay int 710*827bd09bSSatish Balay ivec_ct_bits(register int *ptr, register int n) 711*827bd09bSSatish Balay { 712*827bd09bSSatish Balay register int tmp=0; 713*827bd09bSSatish Balay 714*827bd09bSSatish Balay 715*827bd09bSSatish Balay /* should expand to full 32 bit */ 716*827bd09bSSatish Balay while (n--) 717*827bd09bSSatish Balay { 718*827bd09bSSatish Balay if (*ptr&128) {tmp++;} 719*827bd09bSSatish Balay if (*ptr&64) {tmp++;} 720*827bd09bSSatish Balay if (*ptr&32) {tmp++;} 721*827bd09bSSatish Balay if (*ptr&16) {tmp++;} 722*827bd09bSSatish Balay if (*ptr&8) {tmp++;} 723*827bd09bSSatish Balay if (*ptr&4) {tmp++;} 724*827bd09bSSatish Balay if (*ptr&2) {tmp++;} 725*827bd09bSSatish Balay if (*ptr&1) {tmp++;} 726*827bd09bSSatish Balay ptr++; 727*827bd09bSSatish Balay } 728*827bd09bSSatish Balay 729*827bd09bSSatish Balay return(tmp); 730*827bd09bSSatish Balay } 731*827bd09bSSatish Balay #endif 732*827bd09bSSatish Balay 733*827bd09bSSatish Balay 734*827bd09bSSatish Balay /****************************************************************************** 735*827bd09bSSatish Balay Function: ivec_sort(). 736*827bd09bSSatish Balay 737*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 738*827bd09bSSatish Balay Output: sorted list (in ascending order). 739*827bd09bSSatish Balay Return: none. 740*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 741*827bd09bSSatish Balay ******************************************************************************/ 742*827bd09bSSatish Balay void 743*827bd09bSSatish Balay ivec_sort(register int *ar, register int size) 744*827bd09bSSatish Balay { 745*827bd09bSSatish Balay register int *pi, *pj, temp; 746*827bd09bSSatish Balay register int **top_a = (int **) offset_stack; 747*827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 748*827bd09bSSatish Balay 749*827bd09bSSatish Balay 750*827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 751*827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 752*827bd09bSSatish Balay size--; 753*827bd09bSSatish Balay 754*827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 755*827bd09bSSatish Balay for (;;) 756*827bd09bSSatish Balay { 757*827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 758*827bd09bSSatish Balay if (size > SORT_OPT) 759*827bd09bSSatish Balay { 760*827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 761*827bd09bSSatish Balay pi = ar+1; 762*827bd09bSSatish Balay pj = ar+size; 763*827bd09bSSatish Balay 764*827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 765*827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 766*827bd09bSSatish Balay 767*827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 768*827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 769*827bd09bSSatish Balay if (*pi > *pj) 770*827bd09bSSatish Balay {SWAP(*pi,*pj)} 771*827bd09bSSatish Balay if (*ar > *pj) 772*827bd09bSSatish Balay {SWAP(*ar,*pj)} 773*827bd09bSSatish Balay else if (*pi > *ar) 774*827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 775*827bd09bSSatish Balay 776*827bd09bSSatish Balay /* partition about pivot_value ... */ 777*827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 778*827bd09bSSatish Balay for(;;) 779*827bd09bSSatish Balay { 780*827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 781*827bd09bSSatish Balay do pi++; while (*pi<*ar); 782*827bd09bSSatish Balay do pj--; while (*pj>*ar); 783*827bd09bSSatish Balay 784*827bd09bSSatish Balay /* if we've crossed we're done */ 785*827bd09bSSatish Balay if (pj<pi) break; 786*827bd09bSSatish Balay 787*827bd09bSSatish Balay /* else swap */ 788*827bd09bSSatish Balay SWAP(*pi,*pj) 789*827bd09bSSatish Balay } 790*827bd09bSSatish Balay 791*827bd09bSSatish Balay /* place pivot_value in it's correct location */ 792*827bd09bSSatish Balay SWAP(*ar,*pj) 793*827bd09bSSatish Balay 794*827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 795*827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 796*827bd09bSSatish Balay {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");} 797*827bd09bSSatish Balay 798*827bd09bSSatish Balay /* push right hand child iff length > 1 */ 799*827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 800*827bd09bSSatish Balay { 801*827bd09bSSatish Balay *(top_a++) = pi; 802*827bd09bSSatish Balay size -= *top_s+2; 803*827bd09bSSatish Balay top_s++; 804*827bd09bSSatish Balay } 805*827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 806*827bd09bSSatish Balay else if (size -= *top_s+2) 807*827bd09bSSatish Balay {;} 808*827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 809*827bd09bSSatish Balay else 810*827bd09bSSatish Balay { 811*827bd09bSSatish Balay ar = *(--top_a); 812*827bd09bSSatish Balay size = *(--top_s); 813*827bd09bSSatish Balay } 814*827bd09bSSatish Balay } 815*827bd09bSSatish Balay 816*827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 817*827bd09bSSatish Balay else 818*827bd09bSSatish Balay { 819*827bd09bSSatish Balay /* insertion sort for bottom */ 820*827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 821*827bd09bSSatish Balay { 822*827bd09bSSatish Balay temp = *pj; 823*827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 824*827bd09bSSatish Balay { 825*827bd09bSSatish Balay if (*pi <= temp) break; 826*827bd09bSSatish Balay *(pi+1)=*pi; 827*827bd09bSSatish Balay } 828*827bd09bSSatish Balay *(pi+1)=temp; 829*827bd09bSSatish Balay } 830*827bd09bSSatish Balay 831*827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 832*827bd09bSSatish Balay if (top_s==bottom_s) return; 833*827bd09bSSatish Balay 834*827bd09bSSatish Balay /* else pop another list from the stack */ 835*827bd09bSSatish Balay ar = *(--top_a); 836*827bd09bSSatish Balay size = *(--top_s); 837*827bd09bSSatish Balay } 838*827bd09bSSatish Balay } 839*827bd09bSSatish Balay } 840*827bd09bSSatish Balay 841*827bd09bSSatish Balay 842*827bd09bSSatish Balay 843*827bd09bSSatish Balay /****************************************************************************** 844*827bd09bSSatish Balay Function: ivec_sort_companion(). 845*827bd09bSSatish Balay 846*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 847*827bd09bSSatish Balay Output: sorted list (in ascending order). 848*827bd09bSSatish Balay Return: none. 849*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 850*827bd09bSSatish Balay ******************************************************************************/ 851*827bd09bSSatish Balay void 852*827bd09bSSatish Balay ivec_sort_companion(register int *ar, register int *ar2, register int size) 853*827bd09bSSatish Balay { 854*827bd09bSSatish Balay register int *pi, *pj, temp, temp2; 855*827bd09bSSatish Balay register int **top_a = (int **)offset_stack; 856*827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 857*827bd09bSSatish Balay register int *pi2, *pj2; 858*827bd09bSSatish Balay register int mid; 859*827bd09bSSatish Balay 860*827bd09bSSatish Balay 861*827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 862*827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 863*827bd09bSSatish Balay size--; 864*827bd09bSSatish Balay 865*827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 866*827bd09bSSatish Balay for (;;) 867*827bd09bSSatish Balay { 868*827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 869*827bd09bSSatish Balay if (size > SORT_OPT) 870*827bd09bSSatish Balay { 871*827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 872*827bd09bSSatish Balay mid = size>>1; 873*827bd09bSSatish Balay pi = ar+1; 874*827bd09bSSatish Balay pj = ar+mid; 875*827bd09bSSatish Balay pi2 = ar2+1; 876*827bd09bSSatish Balay pj2 = ar2+mid; 877*827bd09bSSatish Balay 878*827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 879*827bd09bSSatish Balay SWAP(*pi,*pj) 880*827bd09bSSatish Balay SWAP(*pi2,*pj2) 881*827bd09bSSatish Balay 882*827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 883*827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 884*827bd09bSSatish Balay pj = ar+size; 885*827bd09bSSatish Balay pj2 = ar2+size; 886*827bd09bSSatish Balay if (*pi > *pj) 887*827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 888*827bd09bSSatish Balay if (*ar > *pj) 889*827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 890*827bd09bSSatish Balay else if (*pi > *ar) 891*827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 892*827bd09bSSatish Balay 893*827bd09bSSatish Balay /* partition about pivot_value ... */ 894*827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 895*827bd09bSSatish Balay for(;;) 896*827bd09bSSatish Balay { 897*827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 898*827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 899*827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 900*827bd09bSSatish Balay 901*827bd09bSSatish Balay /* if we've crossed we're done */ 902*827bd09bSSatish Balay if (pj<pi) break; 903*827bd09bSSatish Balay 904*827bd09bSSatish Balay /* else swap */ 905*827bd09bSSatish Balay SWAP(*pi,*pj) 906*827bd09bSSatish Balay SWAP(*pi2,*pj2) 907*827bd09bSSatish Balay } 908*827bd09bSSatish Balay 909*827bd09bSSatish Balay /* place pivot_value in it's correct location */ 910*827bd09bSSatish Balay SWAP(*ar,*pj) 911*827bd09bSSatish Balay SWAP(*ar2,*pj2) 912*827bd09bSSatish Balay 913*827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 914*827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 915*827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");} 916*827bd09bSSatish Balay 917*827bd09bSSatish Balay /* push right hand child iff length > 1 */ 918*827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 919*827bd09bSSatish Balay { 920*827bd09bSSatish Balay *(top_a++) = pi; 921*827bd09bSSatish Balay *(top_a++) = pi2; 922*827bd09bSSatish Balay size -= *top_s+2; 923*827bd09bSSatish Balay top_s++; 924*827bd09bSSatish Balay } 925*827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 926*827bd09bSSatish Balay else if (size -= *top_s+2) 927*827bd09bSSatish Balay {;} 928*827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 929*827bd09bSSatish Balay else 930*827bd09bSSatish Balay { 931*827bd09bSSatish Balay ar2 = *(--top_a); 932*827bd09bSSatish Balay ar = *(--top_a); 933*827bd09bSSatish Balay size = *(--top_s); 934*827bd09bSSatish Balay } 935*827bd09bSSatish Balay } 936*827bd09bSSatish Balay 937*827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 938*827bd09bSSatish Balay else 939*827bd09bSSatish Balay { 940*827bd09bSSatish Balay /* insertion sort for bottom */ 941*827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 942*827bd09bSSatish Balay { 943*827bd09bSSatish Balay temp = *pj; 944*827bd09bSSatish Balay temp2 = *pj2; 945*827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 946*827bd09bSSatish Balay { 947*827bd09bSSatish Balay if (*pi <= temp) break; 948*827bd09bSSatish Balay *(pi+1)=*pi; 949*827bd09bSSatish Balay *(pi2+1)=*pi2; 950*827bd09bSSatish Balay } 951*827bd09bSSatish Balay *(pi+1)=temp; 952*827bd09bSSatish Balay *(pi2+1)=temp2; 953*827bd09bSSatish Balay } 954*827bd09bSSatish Balay 955*827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 956*827bd09bSSatish Balay if (top_s==bottom_s) return; 957*827bd09bSSatish Balay 958*827bd09bSSatish Balay /* else pop another list from the stack */ 959*827bd09bSSatish Balay ar2 = *(--top_a); 960*827bd09bSSatish Balay ar = *(--top_a); 961*827bd09bSSatish Balay size = *(--top_s); 962*827bd09bSSatish Balay } 963*827bd09bSSatish Balay } 964*827bd09bSSatish Balay } 965*827bd09bSSatish Balay 966*827bd09bSSatish Balay 967*827bd09bSSatish Balay 968*827bd09bSSatish Balay /****************************************************************************** 969*827bd09bSSatish Balay Function: ivec_sort_companion_hack(). 970*827bd09bSSatish Balay 971*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 972*827bd09bSSatish Balay Output: sorted list (in ascending order). 973*827bd09bSSatish Balay Return: none. 974*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 975*827bd09bSSatish Balay ******************************************************************************/ 976*827bd09bSSatish Balay void 977*827bd09bSSatish Balay ivec_sort_companion_hack(register int *ar, register int **ar2, 978*827bd09bSSatish Balay register int size) 979*827bd09bSSatish Balay { 980*827bd09bSSatish Balay register int *pi, *pj, temp, *ptr; 981*827bd09bSSatish Balay register int **top_a = (int **)offset_stack; 982*827bd09bSSatish Balay register int *top_s = size_stack, *bottom_s = size_stack; 983*827bd09bSSatish Balay register int **pi2, **pj2; 984*827bd09bSSatish Balay register int mid; 985*827bd09bSSatish Balay 986*827bd09bSSatish Balay 987*827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 988*827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 989*827bd09bSSatish Balay size--; 990*827bd09bSSatish Balay 991*827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 992*827bd09bSSatish Balay for (;;) 993*827bd09bSSatish Balay { 994*827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 995*827bd09bSSatish Balay if (size > SORT_OPT) 996*827bd09bSSatish Balay { 997*827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 998*827bd09bSSatish Balay mid = size>>1; 999*827bd09bSSatish Balay pi = ar+1; 1000*827bd09bSSatish Balay pj = ar+mid; 1001*827bd09bSSatish Balay pi2 = ar2+1; 1002*827bd09bSSatish Balay pj2 = ar2+mid; 1003*827bd09bSSatish Balay 1004*827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1005*827bd09bSSatish Balay SWAP(*pi,*pj) 1006*827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1007*827bd09bSSatish Balay 1008*827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1009*827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1010*827bd09bSSatish Balay pj = ar+size; 1011*827bd09bSSatish Balay pj2 = ar2+size; 1012*827bd09bSSatish Balay if (*pi > *pj) 1013*827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1014*827bd09bSSatish Balay if (*ar > *pj) 1015*827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1016*827bd09bSSatish Balay else if (*pi > *ar) 1017*827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1018*827bd09bSSatish Balay 1019*827bd09bSSatish Balay /* partition about pivot_value ... */ 1020*827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1021*827bd09bSSatish Balay for(;;) 1022*827bd09bSSatish Balay { 1023*827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1024*827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1025*827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1026*827bd09bSSatish Balay 1027*827bd09bSSatish Balay /* if we've crossed we're done */ 1028*827bd09bSSatish Balay if (pj<pi) break; 1029*827bd09bSSatish Balay 1030*827bd09bSSatish Balay /* else swap */ 1031*827bd09bSSatish Balay SWAP(*pi,*pj) 1032*827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1033*827bd09bSSatish Balay } 1034*827bd09bSSatish Balay 1035*827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1036*827bd09bSSatish Balay SWAP(*ar,*pj) 1037*827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1038*827bd09bSSatish Balay 1039*827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1040*827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1041*827bd09bSSatish Balay {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");} 1042*827bd09bSSatish Balay 1043*827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1044*827bd09bSSatish Balay if ((*top_s = size-((int) (pi-ar)))) 1045*827bd09bSSatish Balay { 1046*827bd09bSSatish Balay *(top_a++) = pi; 1047*827bd09bSSatish Balay *(top_a++) = (int *) pi2; 1048*827bd09bSSatish Balay size -= *top_s+2; 1049*827bd09bSSatish Balay top_s++; 1050*827bd09bSSatish Balay } 1051*827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1052*827bd09bSSatish Balay else if (size -= *top_s+2) 1053*827bd09bSSatish Balay {;} 1054*827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1055*827bd09bSSatish Balay else 1056*827bd09bSSatish Balay { 1057*827bd09bSSatish Balay ar2 = (int **) *(--top_a); 1058*827bd09bSSatish Balay ar = *(--top_a); 1059*827bd09bSSatish Balay size = *(--top_s); 1060*827bd09bSSatish Balay } 1061*827bd09bSSatish Balay } 1062*827bd09bSSatish Balay 1063*827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1064*827bd09bSSatish Balay else 1065*827bd09bSSatish Balay { 1066*827bd09bSSatish Balay /* insertion sort for bottom */ 1067*827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1068*827bd09bSSatish Balay { 1069*827bd09bSSatish Balay temp = *pj; 1070*827bd09bSSatish Balay ptr = *pj2; 1071*827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1072*827bd09bSSatish Balay { 1073*827bd09bSSatish Balay if (*pi <= temp) break; 1074*827bd09bSSatish Balay *(pi+1)=*pi; 1075*827bd09bSSatish Balay *(pi2+1)=*pi2; 1076*827bd09bSSatish Balay } 1077*827bd09bSSatish Balay *(pi+1)=temp; 1078*827bd09bSSatish Balay *(pi2+1)=ptr; 1079*827bd09bSSatish Balay } 1080*827bd09bSSatish Balay 1081*827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1082*827bd09bSSatish Balay if (top_s==bottom_s) return; 1083*827bd09bSSatish Balay 1084*827bd09bSSatish Balay /* else pop another list from the stack */ 1085*827bd09bSSatish Balay ar2 = (int **)*(--top_a); 1086*827bd09bSSatish Balay ar = *(--top_a); 1087*827bd09bSSatish Balay size = *(--top_s); 1088*827bd09bSSatish Balay } 1089*827bd09bSSatish Balay } 1090*827bd09bSSatish Balay } 1091*827bd09bSSatish Balay 1092*827bd09bSSatish Balay 1093*827bd09bSSatish Balay 1094*827bd09bSSatish Balay /****************************************************************************** 1095*827bd09bSSatish Balay Function: SMI_sort(). 1096*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1097*827bd09bSSatish Balay Output: sorted list (in ascending order). 1098*827bd09bSSatish Balay Return: none. 1099*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1100*827bd09bSSatish Balay ******************************************************************************/ 1101*827bd09bSSatish Balay void 1102*827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type) 1103*827bd09bSSatish Balay { 1104*827bd09bSSatish Balay if (type == SORT_INTEGER) 1105*827bd09bSSatish Balay { 1106*827bd09bSSatish Balay if (ar2) 1107*827bd09bSSatish Balay {ivec_sort_companion((int *)ar1,(int *)ar2,size);} 1108*827bd09bSSatish Balay else 1109*827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1110*827bd09bSSatish Balay } 1111*827bd09bSSatish Balay else if (type == SORT_INT_PTR) 1112*827bd09bSSatish Balay { 1113*827bd09bSSatish Balay if (ar2) 1114*827bd09bSSatish Balay {ivec_sort_companion_hack((int *)ar1,(int **)ar2,size);} 1115*827bd09bSSatish Balay else 1116*827bd09bSSatish Balay {ivec_sort((int*)ar1,size);} 1117*827bd09bSSatish Balay } 1118*827bd09bSSatish Balay 1119*827bd09bSSatish Balay else 1120*827bd09bSSatish Balay { 1121*827bd09bSSatish Balay error_msg_fatal("SMI_sort only does SORT_INTEGER!"); 1122*827bd09bSSatish Balay } 1123*827bd09bSSatish Balay /* 1124*827bd09bSSatish Balay if (type == SORT_REAL) 1125*827bd09bSSatish Balay { 1126*827bd09bSSatish Balay if (ar2) 1127*827bd09bSSatish Balay {rvec_sort_companion(ar2,ar1,size);} 1128*827bd09bSSatish Balay else 1129*827bd09bSSatish Balay {rvec_sort(ar1,size);} 1130*827bd09bSSatish Balay } 1131*827bd09bSSatish Balay */ 1132*827bd09bSSatish Balay } 1133*827bd09bSSatish Balay 1134*827bd09bSSatish Balay 1135*827bd09bSSatish Balay 1136*827bd09bSSatish Balay /**********************************ivec.c************************************** 1137*827bd09bSSatish Balay Function ivec_linear_search() 1138*827bd09bSSatish Balay 1139*827bd09bSSatish Balay Input : 1140*827bd09bSSatish Balay Output: 1141*827bd09bSSatish Balay Return: 1142*827bd09bSSatish Balay Description: 1143*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1144*827bd09bSSatish Balay int 1145*827bd09bSSatish Balay ivec_linear_search(register int item, register int *list, register int n) 1146*827bd09bSSatish Balay { 1147*827bd09bSSatish Balay register int tmp = n-1; 1148*827bd09bSSatish Balay 1149*827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 1150*827bd09bSSatish Balay return(-1); 1151*827bd09bSSatish Balay } 1152*827bd09bSSatish Balay 1153*827bd09bSSatish Balay 1154*827bd09bSSatish Balay 1155*827bd09bSSatish Balay /**********************************ivec.c************************************** 1156*827bd09bSSatish Balay Function ivec_binary_search() 1157*827bd09bSSatish Balay 1158*827bd09bSSatish Balay Input : 1159*827bd09bSSatish Balay Output: 1160*827bd09bSSatish Balay Return: 1161*827bd09bSSatish Balay Description: 1162*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1163*827bd09bSSatish Balay int 1164*827bd09bSSatish Balay ivec_binary_search(register int item, register int *list, register int rh) 1165*827bd09bSSatish Balay { 1166*827bd09bSSatish Balay register int mid, lh=0; 1167*827bd09bSSatish Balay 1168*827bd09bSSatish Balay rh--; 1169*827bd09bSSatish Balay while (lh<=rh) 1170*827bd09bSSatish Balay { 1171*827bd09bSSatish Balay mid = (lh+rh)>>1; 1172*827bd09bSSatish Balay if (*(list+mid) == item) 1173*827bd09bSSatish Balay {return(mid);} 1174*827bd09bSSatish Balay if (*(list+mid) > item) 1175*827bd09bSSatish Balay {rh = mid-1;} 1176*827bd09bSSatish Balay else 1177*827bd09bSSatish Balay {lh = mid+1;} 1178*827bd09bSSatish Balay } 1179*827bd09bSSatish Balay return(-1); 1180*827bd09bSSatish Balay } 1181*827bd09bSSatish Balay 1182*827bd09bSSatish Balay 1183*827bd09bSSatish Balay 1184*827bd09bSSatish Balay /**********************************ivec.c************************************** 1185*827bd09bSSatish Balay Function rvec_dump 1186*827bd09bSSatish Balay 1187*827bd09bSSatish Balay Input : 1188*827bd09bSSatish Balay Output: 1189*827bd09bSSatish Balay Return: 1190*827bd09bSSatish Balay Description: 1191*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1192*827bd09bSSatish Balay void 1193*827bd09bSSatish Balay rvec_dump(REAL *v, int n, int tag, int tag2, char * s) 1194*827bd09bSSatish Balay { 1195*827bd09bSSatish Balay int i; 1196*827bd09bSSatish Balay printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id); 1197*827bd09bSSatish Balay for (i=0;i<n;i++) 1198*827bd09bSSatish Balay {printf("%f ",v[i]);} 1199*827bd09bSSatish Balay printf("\n"); 1200*827bd09bSSatish Balay fflush(stdout); 1201*827bd09bSSatish Balay } 1202*827bd09bSSatish Balay 1203*827bd09bSSatish Balay 1204*827bd09bSSatish Balay 1205*827bd09bSSatish Balay /**********************************ivec.c************************************** 1206*827bd09bSSatish Balay Function rvec_lb_ub() 1207*827bd09bSSatish Balay 1208*827bd09bSSatish Balay Input : 1209*827bd09bSSatish Balay Output: 1210*827bd09bSSatish Balay Return: 1211*827bd09bSSatish Balay Description: 1212*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1213*827bd09bSSatish Balay void 1214*827bd09bSSatish Balay rvec_lb_ub(register REAL *arg1, register int n, REAL *lb, REAL *ub) 1215*827bd09bSSatish Balay { 1216*827bd09bSSatish Balay register REAL min = REAL_MAX; 1217*827bd09bSSatish Balay register REAL max = -REAL_MAX; 1218*827bd09bSSatish Balay 1219*827bd09bSSatish Balay while (n--) 1220*827bd09bSSatish Balay { 1221*827bd09bSSatish Balay min = MIN(min,*arg1); 1222*827bd09bSSatish Balay max = MAX(max,*arg1); 1223*827bd09bSSatish Balay arg1++; 1224*827bd09bSSatish Balay } 1225*827bd09bSSatish Balay 1226*827bd09bSSatish Balay *lb=min; 1227*827bd09bSSatish Balay *ub=max; 1228*827bd09bSSatish Balay } 1229*827bd09bSSatish Balay 1230*827bd09bSSatish Balay 1231*827bd09bSSatish Balay 1232*827bd09bSSatish Balay /********************************ivec.c************************************** 1233*827bd09bSSatish Balay Function rvec_copy() 1234*827bd09bSSatish Balay 1235*827bd09bSSatish Balay Input : 1236*827bd09bSSatish Balay Output: 1237*827bd09bSSatish Balay Return: 1238*827bd09bSSatish Balay Description: 1239*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1240*827bd09bSSatish Balay void 1241*827bd09bSSatish Balay rvec_copy(register REAL *arg1, register REAL *arg2, register int n) 1242*827bd09bSSatish Balay { 1243*827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 1244*827bd09bSSatish Balay } 1245*827bd09bSSatish Balay 1246*827bd09bSSatish Balay 1247*827bd09bSSatish Balay 1248*827bd09bSSatish Balay /********************************ivec.c************************************** 1249*827bd09bSSatish Balay Function rvec_zero() 1250*827bd09bSSatish Balay 1251*827bd09bSSatish Balay Input : 1252*827bd09bSSatish Balay Output: 1253*827bd09bSSatish Balay Return: 1254*827bd09bSSatish Balay Description: 1255*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1256*827bd09bSSatish Balay void 1257*827bd09bSSatish Balay rvec_zero(register REAL *arg1, register int n) 1258*827bd09bSSatish Balay { 1259*827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 1260*827bd09bSSatish Balay } 1261*827bd09bSSatish Balay 1262*827bd09bSSatish Balay 1263*827bd09bSSatish Balay 1264*827bd09bSSatish Balay /**********************************ivec.c************************************** 1265*827bd09bSSatish Balay Function rvec_one() 1266*827bd09bSSatish Balay 1267*827bd09bSSatish Balay Input : 1268*827bd09bSSatish Balay Output: 1269*827bd09bSSatish Balay Return: 1270*827bd09bSSatish Balay Description: 1271*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1272*827bd09bSSatish Balay void 1273*827bd09bSSatish Balay rvec_one(register REAL *arg1, register int n) 1274*827bd09bSSatish Balay { 1275*827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 1276*827bd09bSSatish Balay } 1277*827bd09bSSatish Balay 1278*827bd09bSSatish Balay 1279*827bd09bSSatish Balay 1280*827bd09bSSatish Balay /**********************************ivec.c************************************** 1281*827bd09bSSatish Balay Function rvec_neg_one() 1282*827bd09bSSatish Balay 1283*827bd09bSSatish Balay Input : 1284*827bd09bSSatish Balay Output: 1285*827bd09bSSatish Balay Return: 1286*827bd09bSSatish Balay Description: 1287*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1288*827bd09bSSatish Balay void 1289*827bd09bSSatish Balay rvec_neg_one(register REAL *arg1, register int n) 1290*827bd09bSSatish Balay { 1291*827bd09bSSatish Balay while (n--) {*arg1++ = -1.0;} 1292*827bd09bSSatish Balay } 1293*827bd09bSSatish Balay 1294*827bd09bSSatish Balay 1295*827bd09bSSatish Balay 1296*827bd09bSSatish Balay /**********************************ivec.c************************************** 1297*827bd09bSSatish Balay Function rvec_set() 1298*827bd09bSSatish Balay 1299*827bd09bSSatish Balay Input : 1300*827bd09bSSatish Balay Output: 1301*827bd09bSSatish Balay Return: 1302*827bd09bSSatish Balay Description: 1303*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1304*827bd09bSSatish Balay void 1305*827bd09bSSatish Balay rvec_set(register REAL *arg1, register REAL arg2, register int n) 1306*827bd09bSSatish Balay { 1307*827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 1308*827bd09bSSatish Balay } 1309*827bd09bSSatish Balay 1310*827bd09bSSatish Balay 1311*827bd09bSSatish Balay 1312*827bd09bSSatish Balay /**********************************ivec.c************************************** 1313*827bd09bSSatish Balay Function rvec_scale() 1314*827bd09bSSatish Balay 1315*827bd09bSSatish Balay Input : 1316*827bd09bSSatish Balay Output: 1317*827bd09bSSatish Balay Return: 1318*827bd09bSSatish Balay Description: 1319*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1320*827bd09bSSatish Balay void 1321*827bd09bSSatish Balay rvec_scale(register REAL *arg1, register REAL arg2, register int n) 1322*827bd09bSSatish Balay { 1323*827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 1324*827bd09bSSatish Balay } 1325*827bd09bSSatish Balay 1326*827bd09bSSatish Balay 1327*827bd09bSSatish Balay 1328*827bd09bSSatish Balay /********************************ivec.c************************************** 1329*827bd09bSSatish Balay Function rvec_add() 1330*827bd09bSSatish Balay 1331*827bd09bSSatish Balay Input : 1332*827bd09bSSatish Balay Output: 1333*827bd09bSSatish Balay Return: 1334*827bd09bSSatish Balay Description: 1335*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1336*827bd09bSSatish Balay void 1337*827bd09bSSatish Balay rvec_add(register REAL *arg1, register REAL *arg2, register int n) 1338*827bd09bSSatish Balay { 1339*827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 1340*827bd09bSSatish Balay } 1341*827bd09bSSatish Balay 1342*827bd09bSSatish Balay 1343*827bd09bSSatish Balay 1344*827bd09bSSatish Balay /********************************ivec.c************************************** 1345*827bd09bSSatish Balay Function rvec_dot() 1346*827bd09bSSatish Balay 1347*827bd09bSSatish Balay Input : 1348*827bd09bSSatish Balay Output: 1349*827bd09bSSatish Balay Return: 1350*827bd09bSSatish Balay Description: 1351*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1352*827bd09bSSatish Balay REAL 1353*827bd09bSSatish Balay rvec_dot(register REAL *arg1, register REAL *arg2, register int n) 1354*827bd09bSSatish Balay { 1355*827bd09bSSatish Balay REAL dot=0.0; 1356*827bd09bSSatish Balay 1357*827bd09bSSatish Balay while (n--) {dot+= *arg1++ * *arg2++;} 1358*827bd09bSSatish Balay 1359*827bd09bSSatish Balay return(dot); 1360*827bd09bSSatish Balay } 1361*827bd09bSSatish Balay 1362*827bd09bSSatish Balay 1363*827bd09bSSatish Balay 1364*827bd09bSSatish Balay /********************************ivec.c************************************** 1365*827bd09bSSatish Balay Function rvec_axpy() 1366*827bd09bSSatish Balay 1367*827bd09bSSatish Balay Input : 1368*827bd09bSSatish Balay Output: 1369*827bd09bSSatish Balay Return: 1370*827bd09bSSatish Balay Description: 1371*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1372*827bd09bSSatish Balay void 1373*827bd09bSSatish Balay rvec_axpy(register REAL *arg1, register REAL *arg2, register REAL scale, 1374*827bd09bSSatish Balay register int n) 1375*827bd09bSSatish Balay { 1376*827bd09bSSatish Balay while (n--) {*arg1++ += scale * *arg2++;} 1377*827bd09bSSatish Balay } 1378*827bd09bSSatish Balay 1379*827bd09bSSatish Balay 1380*827bd09bSSatish Balay /********************************ivec.c************************************** 1381*827bd09bSSatish Balay Function rvec_mult() 1382*827bd09bSSatish Balay 1383*827bd09bSSatish Balay Input : 1384*827bd09bSSatish Balay Output: 1385*827bd09bSSatish Balay Return: 1386*827bd09bSSatish Balay Description: 1387*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1388*827bd09bSSatish Balay void 1389*827bd09bSSatish Balay rvec_mult(register REAL *arg1, register REAL *arg2, register int n) 1390*827bd09bSSatish Balay { 1391*827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 1392*827bd09bSSatish Balay } 1393*827bd09bSSatish Balay 1394*827bd09bSSatish Balay 1395*827bd09bSSatish Balay 1396*827bd09bSSatish Balay /********************************ivec.c************************************** 1397*827bd09bSSatish Balay Function rvec_max() 1398*827bd09bSSatish Balay 1399*827bd09bSSatish Balay Input : 1400*827bd09bSSatish Balay Output: 1401*827bd09bSSatish Balay Return: 1402*827bd09bSSatish Balay Description: 1403*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1404*827bd09bSSatish Balay void 1405*827bd09bSSatish Balay rvec_max(register REAL *arg1, register REAL *arg2, register int n) 1406*827bd09bSSatish Balay { 1407*827bd09bSSatish Balay while (n--) {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;} 1408*827bd09bSSatish Balay } 1409*827bd09bSSatish Balay 1410*827bd09bSSatish Balay 1411*827bd09bSSatish Balay 1412*827bd09bSSatish Balay /********************************ivec.c************************************** 1413*827bd09bSSatish Balay Function rvec_max_abs() 1414*827bd09bSSatish Balay 1415*827bd09bSSatish Balay Input : 1416*827bd09bSSatish Balay Output: 1417*827bd09bSSatish Balay Return: 1418*827bd09bSSatish Balay Description: 1419*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1420*827bd09bSSatish Balay void 1421*827bd09bSSatish Balay rvec_max_abs(register REAL *arg1, register REAL *arg2, register int n) 1422*827bd09bSSatish Balay { 1423*827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 1424*827bd09bSSatish Balay } 1425*827bd09bSSatish Balay 1426*827bd09bSSatish Balay 1427*827bd09bSSatish Balay 1428*827bd09bSSatish Balay /********************************ivec.c************************************** 1429*827bd09bSSatish Balay Function rvec_min() 1430*827bd09bSSatish Balay 1431*827bd09bSSatish Balay Input : 1432*827bd09bSSatish Balay Output: 1433*827bd09bSSatish Balay Return: 1434*827bd09bSSatish Balay Description: 1435*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1436*827bd09bSSatish Balay void 1437*827bd09bSSatish Balay rvec_min(register REAL *arg1, register REAL *arg2, register int n) 1438*827bd09bSSatish Balay { 1439*827bd09bSSatish Balay while (n--) {*arg1 = MIN(*arg1,*arg2); arg1++; arg2++;} 1440*827bd09bSSatish Balay } 1441*827bd09bSSatish Balay 1442*827bd09bSSatish Balay 1443*827bd09bSSatish Balay 1444*827bd09bSSatish Balay /********************************ivec.c************************************** 1445*827bd09bSSatish Balay Function rvec_min_abs() 1446*827bd09bSSatish Balay 1447*827bd09bSSatish Balay Input : 1448*827bd09bSSatish Balay Output: 1449*827bd09bSSatish Balay Return: 1450*827bd09bSSatish Balay Description: 1451*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1452*827bd09bSSatish Balay void 1453*827bd09bSSatish Balay rvec_min_abs(register REAL *arg1, register REAL *arg2, register int n) 1454*827bd09bSSatish Balay { 1455*827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 1456*827bd09bSSatish Balay } 1457*827bd09bSSatish Balay 1458*827bd09bSSatish Balay 1459*827bd09bSSatish Balay 1460*827bd09bSSatish Balay /********************************ivec.c************************************** 1461*827bd09bSSatish Balay Function rvec_exists() 1462*827bd09bSSatish Balay 1463*827bd09bSSatish Balay Input : 1464*827bd09bSSatish Balay Output: 1465*827bd09bSSatish Balay Return: 1466*827bd09bSSatish Balay Description: 1467*827bd09bSSatish Balay *********************************ivec.c*************************************/ 1468*827bd09bSSatish Balay void 1469*827bd09bSSatish Balay rvec_exists(register REAL *arg1, register REAL *arg2, register int n) 1470*827bd09bSSatish Balay { 1471*827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 1472*827bd09bSSatish Balay } 1473*827bd09bSSatish Balay 1474*827bd09bSSatish Balay 1475*827bd09bSSatish Balay 1476*827bd09bSSatish Balay /**********************************ivec.c************************************** 1477*827bd09bSSatish Balay Function rvec_non_uniform() 1478*827bd09bSSatish Balay 1479*827bd09bSSatish Balay Input : 1480*827bd09bSSatish Balay Output: 1481*827bd09bSSatish Balay Return: 1482*827bd09bSSatish Balay Description: 1483*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1484*827bd09bSSatish Balay void 1485*827bd09bSSatish Balay rvec_non_uniform(REAL *arg1, REAL *arg2, register int n, register int *arg3) 1486*827bd09bSSatish Balay { 1487*827bd09bSSatish Balay register int i, j, type; 1488*827bd09bSSatish Balay 1489*827bd09bSSatish Balay 1490*827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 1491*827bd09bSSatish Balay for (i=0;i<n;) 1492*827bd09bSSatish Balay { 1493*827bd09bSSatish Balay /* clump 'em for now */ 1494*827bd09bSSatish Balay j=i+1; 1495*827bd09bSSatish Balay type = arg3[i]; 1496*827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 1497*827bd09bSSatish Balay {j++;} 1498*827bd09bSSatish Balay 1499*827bd09bSSatish Balay /* how many together */ 1500*827bd09bSSatish Balay j -= i; 1501*827bd09bSSatish Balay 1502*827bd09bSSatish Balay /* call appropriate ivec function */ 1503*827bd09bSSatish Balay if (type == GL_MAX) 1504*827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 1505*827bd09bSSatish Balay else if (type == GL_MIN) 1506*827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 1507*827bd09bSSatish Balay else if (type == GL_MULT) 1508*827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 1509*827bd09bSSatish Balay else if (type == GL_ADD) 1510*827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 1511*827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1512*827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 1513*827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1514*827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 1515*827bd09bSSatish Balay else if (type == GL_EXISTS) 1516*827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 1517*827bd09bSSatish Balay else 1518*827bd09bSSatish Balay {error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");} 1519*827bd09bSSatish Balay 1520*827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 1521*827bd09bSSatish Balay } 1522*827bd09bSSatish Balay } 1523*827bd09bSSatish Balay 1524*827bd09bSSatish Balay 1525*827bd09bSSatish Balay 1526*827bd09bSSatish Balay /**********************************ivec.c************************************** 1527*827bd09bSSatish Balay Function rvec_fct_addr() 1528*827bd09bSSatish Balay 1529*827bd09bSSatish Balay Input : 1530*827bd09bSSatish Balay Output: 1531*827bd09bSSatish Balay Return: 1532*827bd09bSSatish Balay Description: 1533*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1534*827bd09bSSatish Balay vfp rvec_fct_addr(register int type) 1535*827bd09bSSatish Balay { 1536*827bd09bSSatish Balay if (type == NON_UNIFORM) 1537*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_non_uniform);} 1538*827bd09bSSatish Balay else if (type == GL_MAX) 1539*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_max);} 1540*827bd09bSSatish Balay else if (type == GL_MIN) 1541*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_min);} 1542*827bd09bSSatish Balay else if (type == GL_MULT) 1543*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_mult);} 1544*827bd09bSSatish Balay else if (type == GL_ADD) 1545*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_add);} 1546*827bd09bSSatish Balay else if (type == GL_MAX_ABS) 1547*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_max_abs);} 1548*827bd09bSSatish Balay else if (type == GL_MIN_ABS) 1549*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_min_abs);} 1550*827bd09bSSatish Balay else if (type == GL_EXISTS) 1551*827bd09bSSatish Balay {return((void (*)(void *, void *, int, ...))&rvec_exists);} 1552*827bd09bSSatish Balay 1553*827bd09bSSatish Balay /* catch all ... not good if we get here */ 1554*827bd09bSSatish Balay return(NULL); 1555*827bd09bSSatish Balay } 1556*827bd09bSSatish Balay 1557*827bd09bSSatish Balay 1558*827bd09bSSatish Balay /****************************************************************************** 1559*827bd09bSSatish Balay Function: my_sort(). 1560*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1561*827bd09bSSatish Balay Output: sorted list (in ascending order). 1562*827bd09bSSatish Balay Return: none. 1563*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1564*827bd09bSSatish Balay ******************************************************************************/ 1565*827bd09bSSatish Balay void 1566*827bd09bSSatish Balay rvec_sort(register REAL *ar, register int Size) 1567*827bd09bSSatish Balay { 1568*827bd09bSSatish Balay register REAL *pi, *pj, temp; 1569*827bd09bSSatish Balay register REAL **top_a = (REAL **)offset_stack; 1570*827bd09bSSatish Balay register PTRINT *top_s = psize_stack, *bottom_s = psize_stack; 1571*827bd09bSSatish Balay register PTRINT size = (PTRINT) Size; 1572*827bd09bSSatish Balay 1573*827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1574*827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1575*827bd09bSSatish Balay size--; 1576*827bd09bSSatish Balay 1577*827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1578*827bd09bSSatish Balay for (;;) 1579*827bd09bSSatish Balay { 1580*827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1581*827bd09bSSatish Balay if (size > SORT_OPT) 1582*827bd09bSSatish Balay { 1583*827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1584*827bd09bSSatish Balay pi = ar+1; 1585*827bd09bSSatish Balay pj = ar+size; 1586*827bd09bSSatish Balay 1587*827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1588*827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 1589*827bd09bSSatish Balay 1590*827bd09bSSatish Balay pj = ar+size; 1591*827bd09bSSatish Balay 1592*827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1593*827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1594*827bd09bSSatish Balay if (*pi > *pj) 1595*827bd09bSSatish Balay {SWAP(*pi,*pj)} 1596*827bd09bSSatish Balay if (*ar > *pj) 1597*827bd09bSSatish Balay {SWAP(*ar,*pj)} 1598*827bd09bSSatish Balay else if (*pi > *ar) 1599*827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 1600*827bd09bSSatish Balay 1601*827bd09bSSatish Balay /* partition about pivot_value ... */ 1602*827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1603*827bd09bSSatish Balay for(;;) 1604*827bd09bSSatish Balay { 1605*827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1606*827bd09bSSatish Balay do pi++; while (*pi<*ar); 1607*827bd09bSSatish Balay do pj--; while (*pj>*ar); 1608*827bd09bSSatish Balay 1609*827bd09bSSatish Balay /* if we've crossed we're done */ 1610*827bd09bSSatish Balay if (pj<pi) break; 1611*827bd09bSSatish Balay 1612*827bd09bSSatish Balay /* else swap */ 1613*827bd09bSSatish Balay SWAP(*pi,*pj) 1614*827bd09bSSatish Balay } 1615*827bd09bSSatish Balay 1616*827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1617*827bd09bSSatish Balay SWAP(*ar,*pj) 1618*827bd09bSSatish Balay 1619*827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1620*827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1621*827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1622*827bd09bSSatish Balay 1623*827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1624*827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1625*827bd09bSSatish Balay { 1626*827bd09bSSatish Balay *(top_a++) = pi; 1627*827bd09bSSatish Balay size -= *top_s+2; 1628*827bd09bSSatish Balay top_s++; 1629*827bd09bSSatish Balay } 1630*827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1631*827bd09bSSatish Balay else if (size -= *top_s+2) 1632*827bd09bSSatish Balay {;} 1633*827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1634*827bd09bSSatish Balay else 1635*827bd09bSSatish Balay { 1636*827bd09bSSatish Balay ar = *(--top_a); 1637*827bd09bSSatish Balay size = *(--top_s); 1638*827bd09bSSatish Balay } 1639*827bd09bSSatish Balay } 1640*827bd09bSSatish Balay 1641*827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1642*827bd09bSSatish Balay else 1643*827bd09bSSatish Balay { 1644*827bd09bSSatish Balay /* insertion sort for bottom */ 1645*827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 1646*827bd09bSSatish Balay { 1647*827bd09bSSatish Balay temp = *pj; 1648*827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 1649*827bd09bSSatish Balay { 1650*827bd09bSSatish Balay if (*pi <= temp) break; 1651*827bd09bSSatish Balay *(pi+1)=*pi; 1652*827bd09bSSatish Balay } 1653*827bd09bSSatish Balay *(pi+1)=temp; 1654*827bd09bSSatish Balay } 1655*827bd09bSSatish Balay 1656*827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1657*827bd09bSSatish Balay if (top_s==bottom_s) return; 1658*827bd09bSSatish Balay 1659*827bd09bSSatish Balay /* else pop another list from the stack */ 1660*827bd09bSSatish Balay ar = *(--top_a); 1661*827bd09bSSatish Balay size = *(--top_s); 1662*827bd09bSSatish Balay } 1663*827bd09bSSatish Balay } 1664*827bd09bSSatish Balay } 1665*827bd09bSSatish Balay 1666*827bd09bSSatish Balay 1667*827bd09bSSatish Balay 1668*827bd09bSSatish Balay /****************************************************************************** 1669*827bd09bSSatish Balay Function: my_sort(). 1670*827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted. 1671*827bd09bSSatish Balay Output: sorted list (in ascending order). 1672*827bd09bSSatish Balay Return: none. 1673*827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom. 1674*827bd09bSSatish Balay ******************************************************************************/ 1675*827bd09bSSatish Balay void 1676*827bd09bSSatish Balay rvec_sort_companion(register REAL *ar, register int *ar2, register int Size) 1677*827bd09bSSatish Balay { 1678*827bd09bSSatish Balay register REAL *pi, *pj, temp; 1679*827bd09bSSatish Balay register REAL **top_a = (REAL **)offset_stack; 1680*827bd09bSSatish Balay register PTRINT *top_s = psize_stack, *bottom_s = psize_stack; 1681*827bd09bSSatish Balay register PTRINT size = (PTRINT) Size; 1682*827bd09bSSatish Balay 1683*827bd09bSSatish Balay register int *pi2, *pj2; 1684*827bd09bSSatish Balay register int ptr; 1685*827bd09bSSatish Balay register PTRINT mid; 1686*827bd09bSSatish Balay 1687*827bd09bSSatish Balay 1688*827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 1689*827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 1690*827bd09bSSatish Balay size--; 1691*827bd09bSSatish Balay 1692*827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 1693*827bd09bSSatish Balay for (;;) 1694*827bd09bSSatish Balay { 1695*827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 1696*827bd09bSSatish Balay if (size > SORT_OPT) 1697*827bd09bSSatish Balay { 1698*827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 1699*827bd09bSSatish Balay mid = size>>1; 1700*827bd09bSSatish Balay pi = ar+1; 1701*827bd09bSSatish Balay pj = ar+mid; 1702*827bd09bSSatish Balay pi2 = ar2+1; 1703*827bd09bSSatish Balay pj2 = ar2+mid; 1704*827bd09bSSatish Balay 1705*827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 1706*827bd09bSSatish Balay SWAP(*pi,*pj) 1707*827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1708*827bd09bSSatish Balay 1709*827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 1710*827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 1711*827bd09bSSatish Balay pj = ar+size; 1712*827bd09bSSatish Balay pj2 = ar2+size; 1713*827bd09bSSatish Balay if (*pi > *pj) 1714*827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 1715*827bd09bSSatish Balay if (*ar > *pj) 1716*827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 1717*827bd09bSSatish Balay else if (*pi > *ar) 1718*827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 1719*827bd09bSSatish Balay 1720*827bd09bSSatish Balay /* partition about pivot_value ... */ 1721*827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 1722*827bd09bSSatish Balay for(;;) 1723*827bd09bSSatish Balay { 1724*827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 1725*827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 1726*827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 1727*827bd09bSSatish Balay 1728*827bd09bSSatish Balay /* if we've crossed we're done */ 1729*827bd09bSSatish Balay if (pj<pi) break; 1730*827bd09bSSatish Balay 1731*827bd09bSSatish Balay /* else swap */ 1732*827bd09bSSatish Balay SWAP(*pi,*pj) 1733*827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 1734*827bd09bSSatish Balay } 1735*827bd09bSSatish Balay 1736*827bd09bSSatish Balay /* place pivot_value in it's correct location */ 1737*827bd09bSSatish Balay SWAP(*ar,*pj) 1738*827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 1739*827bd09bSSatish Balay 1740*827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 1741*827bd09bSSatish Balay if (top_s-bottom_s >= SORT_STACK) 1742*827bd09bSSatish Balay {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");} 1743*827bd09bSSatish Balay 1744*827bd09bSSatish Balay /* push right hand child iff length > 1 */ 1745*827bd09bSSatish Balay if ((*top_s = size-(pi-ar))) 1746*827bd09bSSatish Balay { 1747*827bd09bSSatish Balay *(top_a++) = pi; 1748*827bd09bSSatish Balay *(top_a++) = (REAL *) pi2; 1749*827bd09bSSatish Balay size -= *top_s+2; 1750*827bd09bSSatish Balay top_s++; 1751*827bd09bSSatish Balay } 1752*827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 1753*827bd09bSSatish Balay else if (size -= *top_s+2) 1754*827bd09bSSatish Balay {;} 1755*827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 1756*827bd09bSSatish Balay else 1757*827bd09bSSatish Balay { 1758*827bd09bSSatish Balay ar2 = (int *) *(--top_a); 1759*827bd09bSSatish Balay ar = *(--top_a); 1760*827bd09bSSatish Balay size = *(--top_s); 1761*827bd09bSSatish Balay } 1762*827bd09bSSatish Balay } 1763*827bd09bSSatish Balay 1764*827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 1765*827bd09bSSatish Balay else 1766*827bd09bSSatish Balay { 1767*827bd09bSSatish Balay /* insertion sort for bottom */ 1768*827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 1769*827bd09bSSatish Balay { 1770*827bd09bSSatish Balay temp = *pj; 1771*827bd09bSSatish Balay ptr = *pj2; 1772*827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 1773*827bd09bSSatish Balay { 1774*827bd09bSSatish Balay if (*pi <= temp) break; 1775*827bd09bSSatish Balay *(pi+1)=*pi; 1776*827bd09bSSatish Balay *(pi2+1)=*pi2; 1777*827bd09bSSatish Balay } 1778*827bd09bSSatish Balay *(pi+1)=temp; 1779*827bd09bSSatish Balay *(pi2+1)=ptr; 1780*827bd09bSSatish Balay } 1781*827bd09bSSatish Balay 1782*827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 1783*827bd09bSSatish Balay if (top_s==bottom_s) return; 1784*827bd09bSSatish Balay 1785*827bd09bSSatish Balay /* else pop another list from the stack */ 1786*827bd09bSSatish Balay ar2 = (int *) *(--top_a); 1787*827bd09bSSatish Balay ar = *(--top_a); 1788*827bd09bSSatish Balay size = *(--top_s); 1789*827bd09bSSatish Balay } 1790*827bd09bSSatish Balay } 1791*827bd09bSSatish Balay } 1792*827bd09bSSatish Balay 1793*827bd09bSSatish Balay 1794*827bd09bSSatish Balay 1795*827bd09bSSatish Balay 1796*827bd09bSSatish Balay 1797*827bd09bSSatish Balay /**********************************ivec.c************************************** 1798*827bd09bSSatish Balay Function ivec_binary_search() 1799*827bd09bSSatish Balay 1800*827bd09bSSatish Balay Input : 1801*827bd09bSSatish Balay Output: 1802*827bd09bSSatish Balay Return: 1803*827bd09bSSatish Balay Description: 1804*827bd09bSSatish Balay ***********************************ivec.c*************************************/ 1805*827bd09bSSatish Balay int 1806*827bd09bSSatish Balay rvec_binary_search(register REAL item, register REAL *list, register int rh) 1807*827bd09bSSatish Balay { 1808*827bd09bSSatish Balay register int mid, lh=0; 1809*827bd09bSSatish Balay 1810*827bd09bSSatish Balay rh--; 1811*827bd09bSSatish Balay while (lh<=rh) 1812*827bd09bSSatish Balay { 1813*827bd09bSSatish Balay mid = (lh+rh)>>1; 1814*827bd09bSSatish Balay if (*(list+mid) == item) 1815*827bd09bSSatish Balay {return(mid);} 1816*827bd09bSSatish Balay if (*(list+mid) > item) 1817*827bd09bSSatish Balay {rh = mid-1;} 1818*827bd09bSSatish Balay else 1819*827bd09bSSatish Balay {lh = mid+1;} 1820*827bd09bSSatish Balay } 1821*827bd09bSSatish Balay return(-1); 1822*827bd09bSSatish Balay } 1823*827bd09bSSatish Balay 1824*827bd09bSSatish Balay 1825*827bd09bSSatish Balay 1826*827bd09bSSatish Balay 1827*827bd09bSSatish Balay 1828