xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 827bd09bbb551290dd2e51d0997dc3a77eecb2e6)
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