xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision d890fc11e211e8cb1c162f0a6447cb0c905b81b9)
1827bd09bSSatish Balay 
2827bd09bSSatish Balay /**********************************ivec.c**************************************
3827bd09bSSatish Balay SPARSE GATHER-SCATTER PACKAGE: bss_malloc bss_malloc ivec error comm gs queue
4827bd09bSSatish Balay 
5827bd09bSSatish Balay Author: Henry M. Tufo III
6827bd09bSSatish Balay 
7827bd09bSSatish Balay e-mail: hmt@cs.brown.edu
8827bd09bSSatish Balay 
9827bd09bSSatish Balay snail-mail:
10827bd09bSSatish Balay Division of Applied Mathematics
11827bd09bSSatish Balay Brown University
12827bd09bSSatish Balay Providence, RI 02912
13827bd09bSSatish Balay 
14827bd09bSSatish Balay Last Modification:
15827bd09bSSatish Balay 6.21.97
16827bd09bSSatish Balay ***********************************ivec.c*************************************/
17827bd09bSSatish Balay 
18827bd09bSSatish Balay /**********************************ivec.c**************************************
19827bd09bSSatish Balay File Description:
20827bd09bSSatish Balay -----------------
21827bd09bSSatish Balay 
22827bd09bSSatish Balay ***********************************ivec.c*************************************/
23827bd09bSSatish Balay #include <stdio.h>
24827bd09bSSatish Balay #include <math.h>
25827bd09bSSatish Balay #include <float.h>
26827bd09bSSatish Balay #include <limits.h>
27827bd09bSSatish Balay 
28827bd09bSSatish Balay #ifdef MPISRC
29827bd09bSSatish Balay #include <mpi.h>
30827bd09bSSatish Balay #endif
31827bd09bSSatish Balay 
32827bd09bSSatish Balay 
33827bd09bSSatish Balay #include "const.h"
34827bd09bSSatish Balay #include "types.h"
35827bd09bSSatish Balay #include "ivec.h"
36827bd09bSSatish Balay #include "error.h"
37827bd09bSSatish Balay #include "comm.h"
38827bd09bSSatish Balay 
39827bd09bSSatish Balay 
40827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */
41827bd09bSSatish Balay #define   SORT_OPT	6
42827bd09bSSatish Balay #define   SORT_STACK	50000
43827bd09bSSatish Balay 
44827bd09bSSatish Balay 
45827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */
46827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK];
47827bd09bSSatish Balay static int   size_stack[SORT_STACK];
48827bd09bSSatish Balay static PTRINT psize_stack[SORT_STACK];
49827bd09bSSatish Balay 
50827bd09bSSatish Balay 
51827bd09bSSatish Balay 
52827bd09bSSatish Balay /**********************************ivec.c**************************************
53827bd09bSSatish Balay Function ivec_dump()
54827bd09bSSatish Balay 
55827bd09bSSatish Balay Input :
56827bd09bSSatish Balay Output:
57827bd09bSSatish Balay Return:
58827bd09bSSatish Balay Description:
59827bd09bSSatish Balay ***********************************ivec.c*************************************/
60827bd09bSSatish Balay void
61827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s)
62827bd09bSSatish Balay {
63827bd09bSSatish Balay   int i;
64827bd09bSSatish Balay   printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id);
65827bd09bSSatish Balay   for (i=0;i<n;i++)
66827bd09bSSatish Balay     {printf("%2d ",v[i]);}
67827bd09bSSatish Balay   printf("\n");
68827bd09bSSatish Balay   fflush(stdout);
69827bd09bSSatish Balay }
70827bd09bSSatish Balay 
71827bd09bSSatish Balay 
72827bd09bSSatish Balay 
73827bd09bSSatish Balay /**********************************ivec.c**************************************
74827bd09bSSatish Balay Function ivec_lb_ub()
75827bd09bSSatish Balay 
76827bd09bSSatish Balay Input :
77827bd09bSSatish Balay Output:
78827bd09bSSatish Balay Return:
79827bd09bSSatish Balay Description:
80827bd09bSSatish Balay ***********************************ivec.c*************************************/
81827bd09bSSatish Balay void
82827bd09bSSatish Balay ivec_lb_ub(register int *arg1, register int n, int *lb, int *ub)
83827bd09bSSatish Balay {
84827bd09bSSatish Balay   register int min = INT_MAX;
85827bd09bSSatish Balay   register int max = INT_MIN;
86827bd09bSSatish Balay 
87827bd09bSSatish Balay   while (n--)
88827bd09bSSatish Balay     {
89827bd09bSSatish Balay      min = MIN(min,*arg1);
90827bd09bSSatish Balay      max = MAX(max,*arg1);
91827bd09bSSatish Balay      arg1++;
92827bd09bSSatish Balay     }
93827bd09bSSatish Balay 
94827bd09bSSatish Balay   *lb=min;
95827bd09bSSatish Balay   *ub=max;
96827bd09bSSatish Balay }
97827bd09bSSatish Balay 
98827bd09bSSatish Balay 
99827bd09bSSatish Balay 
100827bd09bSSatish Balay /**********************************ivec.c**************************************
101827bd09bSSatish Balay Function ivec_copy()
102827bd09bSSatish Balay 
103827bd09bSSatish Balay Input :
104827bd09bSSatish Balay Output:
105827bd09bSSatish Balay Return:
106827bd09bSSatish Balay Description:
107827bd09bSSatish Balay ***********************************ivec.c*************************************/
108*d890fc11SSatish Balay int *ivec_copy(register int *arg1, register int *arg2, register int n)
109827bd09bSSatish Balay {
110827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
111827bd09bSSatish Balay   return(arg1);
112827bd09bSSatish Balay }
113827bd09bSSatish Balay 
114827bd09bSSatish Balay 
115827bd09bSSatish Balay 
116827bd09bSSatish Balay /**********************************ivec.c**************************************
117827bd09bSSatish Balay Function ivec_zero()
118827bd09bSSatish Balay 
119827bd09bSSatish Balay Input :
120827bd09bSSatish Balay Output:
121827bd09bSSatish Balay Return:
122827bd09bSSatish Balay Description:
123827bd09bSSatish Balay ***********************************ivec.c*************************************/
124827bd09bSSatish Balay void
125827bd09bSSatish Balay ivec_zero(register int *arg1, register int n)
126827bd09bSSatish Balay {
127827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
128827bd09bSSatish Balay }
129827bd09bSSatish Balay 
130827bd09bSSatish Balay 
131827bd09bSSatish Balay 
132827bd09bSSatish Balay /**********************************ivec.c**************************************
133827bd09bSSatish Balay Function ivec_comp()
134827bd09bSSatish Balay 
135827bd09bSSatish Balay Input :
136827bd09bSSatish Balay Output:
137827bd09bSSatish Balay Return:
138827bd09bSSatish Balay Description:
139827bd09bSSatish Balay ***********************************ivec.c*************************************/
140827bd09bSSatish Balay void
141827bd09bSSatish Balay ivec_comp(register int *arg1, register int n)
142827bd09bSSatish Balay {
143827bd09bSSatish Balay   while (n--)  {*arg1 = ~*arg1; arg1++;}
144827bd09bSSatish Balay }
145827bd09bSSatish Balay 
146827bd09bSSatish Balay 
147827bd09bSSatish Balay 
148827bd09bSSatish Balay /**********************************ivec.c**************************************
149827bd09bSSatish Balay Function ivec_neg_one()
150827bd09bSSatish Balay 
151827bd09bSSatish Balay Input :
152827bd09bSSatish Balay Output:
153827bd09bSSatish Balay Return:
154827bd09bSSatish Balay Description:
155827bd09bSSatish Balay ***********************************ivec.c*************************************/
156827bd09bSSatish Balay void
157827bd09bSSatish Balay ivec_neg_one(register int *arg1, register int n)
158827bd09bSSatish Balay {
159827bd09bSSatish Balay   while (n--)  {*arg1++ = -1;}
160827bd09bSSatish Balay }
161827bd09bSSatish Balay 
162827bd09bSSatish Balay 
163827bd09bSSatish Balay 
164827bd09bSSatish Balay /**********************************ivec.c**************************************
165827bd09bSSatish Balay Function ivec_pos_one()
166827bd09bSSatish Balay 
167827bd09bSSatish Balay Input :
168827bd09bSSatish Balay Output:
169827bd09bSSatish Balay Return:
170827bd09bSSatish Balay Description:
171827bd09bSSatish Balay ***********************************ivec.c*************************************/
172827bd09bSSatish Balay void
173827bd09bSSatish Balay ivec_pos_one(register int *arg1, register int n)
174827bd09bSSatish Balay {
175827bd09bSSatish Balay   while (n--)  {*arg1++ = 1;}
176827bd09bSSatish Balay }
177827bd09bSSatish Balay 
178827bd09bSSatish Balay 
179827bd09bSSatish Balay 
180827bd09bSSatish Balay /**********************************ivec.c**************************************
181827bd09bSSatish Balay Function ivec_c_index()
182827bd09bSSatish Balay 
183827bd09bSSatish Balay Input :
184827bd09bSSatish Balay Output:
185827bd09bSSatish Balay Return:
186827bd09bSSatish Balay Description:
187827bd09bSSatish Balay ***********************************ivec.c*************************************/
188827bd09bSSatish Balay void
189827bd09bSSatish Balay ivec_c_index(register int *arg1, register int n)
190827bd09bSSatish Balay {
191827bd09bSSatish Balay   register int i=0;
192827bd09bSSatish Balay 
193827bd09bSSatish Balay 
194827bd09bSSatish Balay   while (n--)  {*arg1++ = i++;}
195827bd09bSSatish Balay }
196827bd09bSSatish Balay 
197827bd09bSSatish Balay 
198827bd09bSSatish Balay 
199827bd09bSSatish Balay /**********************************ivec.c**************************************
200827bd09bSSatish Balay Function ivec_fortran_index()
201827bd09bSSatish Balay 
202827bd09bSSatish Balay Input :
203827bd09bSSatish Balay Output:
204827bd09bSSatish Balay Return:
205827bd09bSSatish Balay Description:
206827bd09bSSatish Balay ***********************************ivec.c*************************************/
207827bd09bSSatish Balay void
208827bd09bSSatish Balay ivec_fortran_index(register int *arg1, register int n)
209827bd09bSSatish Balay {
210827bd09bSSatish Balay   register int i=0;
211827bd09bSSatish Balay 
212827bd09bSSatish Balay 
213827bd09bSSatish Balay   while (n--)  {*arg1++ = ++i;}
214827bd09bSSatish Balay }
215827bd09bSSatish Balay 
216827bd09bSSatish Balay 
217827bd09bSSatish Balay 
218827bd09bSSatish Balay /**********************************ivec.c**************************************
219827bd09bSSatish Balay Function ivec_set()
220827bd09bSSatish Balay 
221827bd09bSSatish Balay Input :
222827bd09bSSatish Balay Output:
223827bd09bSSatish Balay Return:
224827bd09bSSatish Balay Description:
225827bd09bSSatish Balay ***********************************ivec.c*************************************/
226827bd09bSSatish Balay void
227827bd09bSSatish Balay ivec_set(register int *arg1, register int arg2, register int n)
228827bd09bSSatish Balay {
229827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
230827bd09bSSatish Balay }
231827bd09bSSatish Balay 
232827bd09bSSatish Balay 
233827bd09bSSatish Balay 
234827bd09bSSatish Balay /**********************************ivec.c**************************************
235827bd09bSSatish Balay Function ivec_cmp()
236827bd09bSSatish Balay 
237827bd09bSSatish Balay Input :
238827bd09bSSatish Balay Output:
239827bd09bSSatish Balay Return:
240827bd09bSSatish Balay Description:
241827bd09bSSatish Balay ***********************************ivec.c*************************************/
242827bd09bSSatish Balay int
243827bd09bSSatish Balay ivec_cmp(register int *arg1, register int *arg2, register int n)
244827bd09bSSatish Balay {
245827bd09bSSatish Balay   while (n--)  {if (*arg1++ != *arg2++)  {return(FALSE);}}
246827bd09bSSatish Balay   return(TRUE);
247827bd09bSSatish Balay }
248827bd09bSSatish Balay 
249827bd09bSSatish Balay 
250827bd09bSSatish Balay 
251827bd09bSSatish Balay /**********************************ivec.c**************************************
252827bd09bSSatish Balay Function ivec_max()
253827bd09bSSatish Balay 
254827bd09bSSatish Balay Input :
255827bd09bSSatish Balay Output:
256827bd09bSSatish Balay Return:
257827bd09bSSatish Balay Description:
258827bd09bSSatish Balay ***********************************ivec.c*************************************/
259827bd09bSSatish Balay void
260827bd09bSSatish Balay ivec_max(register int *arg1, register int *arg2, register int n)
261827bd09bSSatish Balay {
262827bd09bSSatish Balay   while (n--)  {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;}
263827bd09bSSatish Balay }
264827bd09bSSatish Balay 
265827bd09bSSatish Balay 
266827bd09bSSatish Balay 
267827bd09bSSatish Balay /**********************************ivec.c**************************************
268827bd09bSSatish Balay Function ivec_min()
269827bd09bSSatish Balay 
270827bd09bSSatish Balay Input :
271827bd09bSSatish Balay Output:
272827bd09bSSatish Balay Return:
273827bd09bSSatish Balay Description:
274827bd09bSSatish Balay ***********************************ivec.c*************************************/
275827bd09bSSatish Balay void
276827bd09bSSatish Balay ivec_min(register int *arg1, register int *arg2, register int n)
277827bd09bSSatish Balay {
278827bd09bSSatish Balay   while (n--)  {*(arg1) = MIN(*arg1,*arg2); arg1++; arg2++;}
279827bd09bSSatish Balay }
280827bd09bSSatish Balay 
281827bd09bSSatish Balay 
282827bd09bSSatish Balay 
283827bd09bSSatish Balay /**********************************ivec.c**************************************
284827bd09bSSatish Balay Function ivec_mult()
285827bd09bSSatish Balay 
286827bd09bSSatish Balay Input :
287827bd09bSSatish Balay Output:
288827bd09bSSatish Balay Return:
289827bd09bSSatish Balay Description:
290827bd09bSSatish Balay ***********************************ivec.c*************************************/
291827bd09bSSatish Balay void
292827bd09bSSatish Balay ivec_mult(register int *arg1, register int *arg2, register int n)
293827bd09bSSatish Balay {
294827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
295827bd09bSSatish Balay }
296827bd09bSSatish Balay 
297827bd09bSSatish Balay 
298827bd09bSSatish Balay 
299827bd09bSSatish Balay /**********************************ivec.c**************************************
300827bd09bSSatish Balay Function ivec_add()
301827bd09bSSatish Balay 
302827bd09bSSatish Balay Input :
303827bd09bSSatish Balay Output:
304827bd09bSSatish Balay Return:
305827bd09bSSatish Balay Description:
306827bd09bSSatish Balay ***********************************ivec.c*************************************/
307827bd09bSSatish Balay void
308827bd09bSSatish Balay ivec_add(register int *arg1, register int *arg2, register int n)
309827bd09bSSatish Balay {
310827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
311827bd09bSSatish Balay }
312827bd09bSSatish Balay 
313827bd09bSSatish Balay 
314827bd09bSSatish Balay 
315827bd09bSSatish Balay /**********************************ivec.c**************************************
316827bd09bSSatish Balay Function ivec_lxor()
317827bd09bSSatish Balay 
318827bd09bSSatish Balay Input :
319827bd09bSSatish Balay Output:
320827bd09bSSatish Balay Return:
321827bd09bSSatish Balay Description:
322827bd09bSSatish Balay ***********************************ivec.c*************************************/
323827bd09bSSatish Balay void
324827bd09bSSatish Balay ivec_lxor(register int *arg1, register int *arg2, register int n)
325827bd09bSSatish Balay {
326827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
327827bd09bSSatish Balay }
328827bd09bSSatish Balay 
329827bd09bSSatish Balay 
330827bd09bSSatish Balay 
331827bd09bSSatish Balay /**********************************ivec.c**************************************
332827bd09bSSatish Balay Function ivec_xor()
333827bd09bSSatish Balay 
334827bd09bSSatish Balay Input :
335827bd09bSSatish Balay Output:
336827bd09bSSatish Balay Return:
337827bd09bSSatish Balay Description:
338827bd09bSSatish Balay ***********************************ivec.c*************************************/
339827bd09bSSatish Balay void
340827bd09bSSatish Balay ivec_xor(register int *arg1, register int *arg2, register int n)
341827bd09bSSatish Balay {
342827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
343827bd09bSSatish Balay }
344827bd09bSSatish Balay 
345827bd09bSSatish Balay 
346827bd09bSSatish Balay 
347827bd09bSSatish Balay /**********************************ivec.c**************************************
348827bd09bSSatish Balay Function ivec_or()
349827bd09bSSatish Balay 
350827bd09bSSatish Balay Input :
351827bd09bSSatish Balay Output:
352827bd09bSSatish Balay Return:
353827bd09bSSatish Balay Description:
354827bd09bSSatish Balay ***********************************ivec.c*************************************/
355827bd09bSSatish Balay void
356827bd09bSSatish Balay ivec_or(register int *arg1, register int *arg2, register int n)
357827bd09bSSatish Balay {
358827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
359827bd09bSSatish Balay }
360827bd09bSSatish Balay 
361827bd09bSSatish Balay 
362827bd09bSSatish Balay 
363827bd09bSSatish Balay /**********************************ivec.c**************************************
364827bd09bSSatish Balay Function ivec_lor()
365827bd09bSSatish Balay 
366827bd09bSSatish Balay Input :
367827bd09bSSatish Balay Output:
368827bd09bSSatish Balay Return:
369827bd09bSSatish Balay Description:
370827bd09bSSatish Balay ***********************************ivec.c*************************************/
371827bd09bSSatish Balay void
372827bd09bSSatish Balay ivec_lor(register int *arg1, register int *arg2, register int n)
373827bd09bSSatish Balay {
374827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
375827bd09bSSatish Balay }
376827bd09bSSatish Balay 
377827bd09bSSatish Balay 
378827bd09bSSatish Balay 
379827bd09bSSatish Balay /**********************************ivec.c**************************************
380827bd09bSSatish Balay Function ivec_or3()
381827bd09bSSatish Balay 
382827bd09bSSatish Balay Input :
383827bd09bSSatish Balay Output:
384827bd09bSSatish Balay Return:
385827bd09bSSatish Balay Description:
386827bd09bSSatish Balay ***********************************ivec.c*************************************/
387827bd09bSSatish Balay void
388827bd09bSSatish Balay ivec_or3(register int *arg1, register int *arg2, register int *arg3,
389827bd09bSSatish Balay 	 register int n)
390827bd09bSSatish Balay {
391827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ | *arg3++);}
392827bd09bSSatish Balay }
393827bd09bSSatish Balay 
394827bd09bSSatish Balay 
395827bd09bSSatish Balay 
396827bd09bSSatish Balay /**********************************ivec.c**************************************
397827bd09bSSatish Balay Function ivec_and()
398827bd09bSSatish Balay 
399827bd09bSSatish Balay Input :
400827bd09bSSatish Balay Output:
401827bd09bSSatish Balay Return:
402827bd09bSSatish Balay Description:
403827bd09bSSatish Balay ***********************************ivec.c*************************************/
404827bd09bSSatish Balay void
405827bd09bSSatish Balay ivec_and(register int *arg1, register int *arg2, register int n)
406827bd09bSSatish Balay {
407827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
408827bd09bSSatish Balay }
409827bd09bSSatish Balay 
410827bd09bSSatish Balay 
411827bd09bSSatish Balay 
412827bd09bSSatish Balay /**********************************ivec.c**************************************
413827bd09bSSatish Balay Function ivec_land()
414827bd09bSSatish Balay 
415827bd09bSSatish Balay Input :
416827bd09bSSatish Balay Output:
417827bd09bSSatish Balay Return:
418827bd09bSSatish Balay Description:
419827bd09bSSatish Balay ***********************************ivec.c*************************************/
420827bd09bSSatish Balay void
421827bd09bSSatish Balay ivec_land(register int *arg1, register int *arg2, register int n)
422827bd09bSSatish Balay {
423827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
424827bd09bSSatish Balay }
425827bd09bSSatish Balay 
426827bd09bSSatish Balay 
427827bd09bSSatish Balay 
428827bd09bSSatish Balay /**********************************ivec.c**************************************
429827bd09bSSatish Balay Function ivec_and3()
430827bd09bSSatish Balay 
431827bd09bSSatish Balay Input :
432827bd09bSSatish Balay Output:
433827bd09bSSatish Balay Return:
434827bd09bSSatish Balay Description:
435827bd09bSSatish Balay ***********************************ivec.c*************************************/
436827bd09bSSatish Balay void
437827bd09bSSatish Balay ivec_and3(register int *arg1, register int *arg2, register int *arg3,
438827bd09bSSatish Balay 	  register int n)
439827bd09bSSatish Balay {
440827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
441827bd09bSSatish Balay }
442827bd09bSSatish Balay 
443827bd09bSSatish Balay 
444827bd09bSSatish Balay 
445827bd09bSSatish Balay /**********************************ivec.c**************************************
446827bd09bSSatish Balay Function ivec_sum
447827bd09bSSatish Balay 
448827bd09bSSatish Balay Input :
449827bd09bSSatish Balay Output:
450827bd09bSSatish Balay Return:
451827bd09bSSatish Balay Description:
452827bd09bSSatish Balay ***********************************ivec.c*************************************/
453*d890fc11SSatish Balay int ivec_sum(register int *arg1, register int n)
454827bd09bSSatish Balay {
455827bd09bSSatish Balay   register int tmp = 0;
456827bd09bSSatish Balay 
457827bd09bSSatish Balay 
458827bd09bSSatish Balay   while (n--) {tmp += *arg1++;}
459827bd09bSSatish Balay   return(tmp);
460827bd09bSSatish Balay }
461827bd09bSSatish Balay 
462827bd09bSSatish Balay 
463827bd09bSSatish Balay 
464827bd09bSSatish Balay /**********************************ivec.c**************************************
465827bd09bSSatish Balay Function ivec_reduce_and
466827bd09bSSatish Balay 
467827bd09bSSatish Balay Input :
468827bd09bSSatish Balay Output:
469827bd09bSSatish Balay Return:
470827bd09bSSatish Balay Description:
471827bd09bSSatish Balay ***********************************ivec.c*************************************/
472*d890fc11SSatish Balay int ivec_reduce_and(register int *arg1, register int n)
473827bd09bSSatish Balay {
474827bd09bSSatish Balay   register int tmp = ALL_ONES;
475827bd09bSSatish Balay 
476827bd09bSSatish Balay 
477827bd09bSSatish Balay   while (n--) {tmp &= *arg1++;}
478827bd09bSSatish Balay   return(tmp);
479827bd09bSSatish Balay }
480827bd09bSSatish Balay 
481827bd09bSSatish Balay 
482827bd09bSSatish Balay 
483827bd09bSSatish Balay /**********************************ivec.c**************************************
484827bd09bSSatish Balay Function ivec_reduce_or
485827bd09bSSatish Balay 
486827bd09bSSatish Balay Input :
487827bd09bSSatish Balay Output:
488827bd09bSSatish Balay Return:
489827bd09bSSatish Balay Description:
490827bd09bSSatish Balay ***********************************ivec.c*************************************/
491*d890fc11SSatish Balay int ivec_reduce_or(register int *arg1, register int n)
492827bd09bSSatish Balay {
493827bd09bSSatish Balay   register int tmp = 0;
494827bd09bSSatish Balay 
495827bd09bSSatish Balay 
496827bd09bSSatish Balay   while (n--) {tmp |= *arg1++;}
497827bd09bSSatish Balay   return(tmp);
498827bd09bSSatish Balay }
499827bd09bSSatish Balay 
500827bd09bSSatish Balay 
501827bd09bSSatish Balay 
502827bd09bSSatish Balay /**********************************ivec.c**************************************
503827bd09bSSatish Balay Function ivec_prod
504827bd09bSSatish Balay 
505827bd09bSSatish Balay Input :
506827bd09bSSatish Balay Output:
507827bd09bSSatish Balay Return:
508827bd09bSSatish Balay Description:
509827bd09bSSatish Balay ***********************************ivec.c*************************************/
510*d890fc11SSatish Balay int ivec_prod(register int *arg1, register int n)
511827bd09bSSatish Balay {
512827bd09bSSatish Balay   register int tmp = 1;
513827bd09bSSatish Balay 
514827bd09bSSatish Balay 
515827bd09bSSatish Balay   while (n--)  {tmp *= *arg1++;}
516827bd09bSSatish Balay   return(tmp);
517827bd09bSSatish Balay }
518827bd09bSSatish Balay 
519827bd09bSSatish Balay 
520827bd09bSSatish Balay 
521827bd09bSSatish Balay /**********************************ivec.c**************************************
522827bd09bSSatish Balay Function ivec_u_sum
523827bd09bSSatish Balay 
524827bd09bSSatish Balay Input :
525827bd09bSSatish Balay Output:
526827bd09bSSatish Balay Return:
527827bd09bSSatish Balay Description:
528827bd09bSSatish Balay ***********************************ivec.c*************************************/
529*d890fc11SSatish Balay int ivec_u_sum(register unsigned *arg1, register int n)
530827bd09bSSatish Balay {
531827bd09bSSatish Balay   register unsigned tmp = 0;
532827bd09bSSatish Balay 
533827bd09bSSatish Balay 
534827bd09bSSatish Balay   while (n--)  {tmp += *arg1++;}
535827bd09bSSatish Balay   return(tmp);
536827bd09bSSatish Balay }
537827bd09bSSatish Balay 
538827bd09bSSatish Balay 
539827bd09bSSatish Balay 
540827bd09bSSatish Balay /**********************************ivec.c**************************************
541827bd09bSSatish Balay Function ivec_lb()
542827bd09bSSatish Balay 
543827bd09bSSatish Balay Input :
544827bd09bSSatish Balay Output:
545827bd09bSSatish Balay Return:
546827bd09bSSatish Balay Description:
547827bd09bSSatish Balay ***********************************ivec.c*************************************/
548827bd09bSSatish Balay int
549827bd09bSSatish Balay ivec_lb(register int *arg1, register int n)
550827bd09bSSatish Balay {
551827bd09bSSatish Balay   register int min = INT_MAX;
552827bd09bSSatish Balay 
553827bd09bSSatish Balay 
554827bd09bSSatish Balay   while (n--)  {min = MIN(min,*arg1); arg1++;}
555827bd09bSSatish Balay   return(min);
556827bd09bSSatish Balay }
557827bd09bSSatish Balay 
558827bd09bSSatish Balay 
559827bd09bSSatish Balay 
560827bd09bSSatish Balay /**********************************ivec.c**************************************
561827bd09bSSatish Balay Function ivec_ub()
562827bd09bSSatish Balay 
563827bd09bSSatish Balay Input :
564827bd09bSSatish Balay Output:
565827bd09bSSatish Balay Return:
566827bd09bSSatish Balay Description:
567827bd09bSSatish Balay ***********************************ivec.c*************************************/
568827bd09bSSatish Balay int
569827bd09bSSatish Balay ivec_ub(register int *arg1, register int n)
570827bd09bSSatish Balay {
571827bd09bSSatish Balay   register int max = INT_MIN;
572827bd09bSSatish Balay 
573827bd09bSSatish Balay 
574827bd09bSSatish Balay   while (n--)  {max = MAX(max,*arg1); arg1++;}
575827bd09bSSatish Balay   return(max);
576827bd09bSSatish Balay }
577827bd09bSSatish Balay 
578827bd09bSSatish Balay 
579827bd09bSSatish Balay 
580827bd09bSSatish Balay /**********************************ivec.c**************************************
581827bd09bSSatish Balay Function split_buf()
582827bd09bSSatish Balay 
583827bd09bSSatish Balay Input :
584827bd09bSSatish Balay Output:
585827bd09bSSatish Balay Return:
586827bd09bSSatish Balay Description:
587827bd09bSSatish Balay 
588827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!!
589827bd09bSSatish Balay ***********************************ivec.c*************************************/
590827bd09bSSatish Balay int
591827bd09bSSatish Balay ivec_split_buf(int *buf1, int **buf2, register int size)
592827bd09bSSatish Balay {
593827bd09bSSatish Balay   *buf2 = (buf1 + (size>>3));
594827bd09bSSatish Balay   return(size);
595827bd09bSSatish Balay }
596827bd09bSSatish Balay 
597827bd09bSSatish Balay 
598827bd09bSSatish Balay 
599827bd09bSSatish Balay /**********************************ivec.c**************************************
600827bd09bSSatish Balay Function ivec_non_uniform()
601827bd09bSSatish Balay 
602827bd09bSSatish Balay Input :
603827bd09bSSatish Balay Output:
604827bd09bSSatish Balay Return:
605827bd09bSSatish Balay Description:
606827bd09bSSatish Balay ***********************************ivec.c*************************************/
607827bd09bSSatish Balay void
608827bd09bSSatish Balay ivec_non_uniform(int *arg1, int *arg2, register int n, register int *arg3)
609827bd09bSSatish Balay {
610827bd09bSSatish Balay   register int i, j, type;
611827bd09bSSatish Balay 
612827bd09bSSatish Balay 
613827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
614827bd09bSSatish Balay   for (i=0;i<n;)
615827bd09bSSatish Balay     {
616827bd09bSSatish Balay       /* clump 'em for now */
617827bd09bSSatish Balay       j=i+1;
618827bd09bSSatish Balay       type = arg3[i];
619827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
620827bd09bSSatish Balay 	{j++;}
621827bd09bSSatish Balay 
622827bd09bSSatish Balay       /* how many together */
623827bd09bSSatish Balay       j -= i;
624827bd09bSSatish Balay 
625827bd09bSSatish Balay       /* call appropriate ivec function */
626827bd09bSSatish Balay       if (type == GL_MAX)
627827bd09bSSatish Balay 	{ivec_max(arg1,arg2,j);}
628827bd09bSSatish Balay       else if (type == GL_MIN)
629827bd09bSSatish Balay 	{ivec_min(arg1,arg2,j);}
630827bd09bSSatish Balay       else if (type == GL_MULT)
631827bd09bSSatish Balay 	{ivec_mult(arg1,arg2,j);}
632827bd09bSSatish Balay       else if (type == GL_ADD)
633827bd09bSSatish Balay 	{ivec_add(arg1,arg2,j);}
634827bd09bSSatish Balay       else if (type == GL_B_XOR)
635827bd09bSSatish Balay 	{ivec_xor(arg1,arg2,j);}
636827bd09bSSatish Balay       else if (type == GL_B_OR)
637827bd09bSSatish Balay 	{ivec_or(arg1,arg2,j);}
638827bd09bSSatish Balay       else if (type == GL_B_AND)
639827bd09bSSatish Balay 	{ivec_and(arg1,arg2,j);}
640827bd09bSSatish Balay       else if (type == GL_L_XOR)
641827bd09bSSatish Balay 	{ivec_lxor(arg1,arg2,j);}
642827bd09bSSatish Balay       else if (type == GL_L_OR)
643827bd09bSSatish Balay 	{ivec_lor(arg1,arg2,j);}
644827bd09bSSatish Balay       else if (type == GL_L_AND)
645827bd09bSSatish Balay 	{ivec_land(arg1,arg2,j);}
646827bd09bSSatish Balay       else
647827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");}
648827bd09bSSatish Balay 
649827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
650827bd09bSSatish Balay     }
651827bd09bSSatish Balay }
652827bd09bSSatish Balay 
653827bd09bSSatish Balay 
654827bd09bSSatish Balay 
655827bd09bSSatish Balay /**********************************ivec.c**************************************
656827bd09bSSatish Balay Function ivec_addr()
657827bd09bSSatish Balay 
658827bd09bSSatish Balay Input :
659827bd09bSSatish Balay Output:
660827bd09bSSatish Balay Return:
661827bd09bSSatish Balay Description:
662827bd09bSSatish Balay ***********************************ivec.c*************************************/
663827bd09bSSatish Balay vfp ivec_fct_addr(register int type)
664827bd09bSSatish Balay {
665827bd09bSSatish Balay   if (type == NON_UNIFORM)
666827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_non_uniform);}
667827bd09bSSatish Balay   else if (type == GL_MAX)
668827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_max);}
669827bd09bSSatish Balay   else if (type == GL_MIN)
670827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_min);}
671827bd09bSSatish Balay   else if (type == GL_MULT)
672827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_mult);}
673827bd09bSSatish Balay   else if (type == GL_ADD)
674827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_add);}
675827bd09bSSatish Balay   else if (type == GL_B_XOR)
676827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_xor);}
677827bd09bSSatish Balay   else if (type == GL_B_OR)
678827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_or);}
679827bd09bSSatish Balay   else if (type == GL_B_AND)
680827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_and);}
681827bd09bSSatish Balay   else if (type == GL_L_XOR)
682827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_lxor);}
683827bd09bSSatish Balay   else if (type == GL_L_OR)
684827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_lor);}
685827bd09bSSatish Balay   else if (type == GL_L_AND)
686827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&ivec_land);}
687827bd09bSSatish Balay 
688827bd09bSSatish Balay   /* catch all ... not good if we get here */
689827bd09bSSatish Balay   return(NULL);
690827bd09bSSatish Balay }
691827bd09bSSatish Balay 
692827bd09bSSatish Balay 
693827bd09bSSatish Balay /**********************************ivec.c**************************************
694827bd09bSSatish Balay Function ct_bits()
695827bd09bSSatish Balay 
696827bd09bSSatish Balay Input :
697827bd09bSSatish Balay Output:
698827bd09bSSatish Balay Return:
699827bd09bSSatish Balay Description: MUST FIX THIS!!!
700827bd09bSSatish Balay ***********************************ivec.c*************************************/
701827bd09bSSatish Balay #if defined(notusing)
702827bd09bSSatish Balay static
703827bd09bSSatish Balay int
704827bd09bSSatish Balay ivec_ct_bits(register int *ptr, register int n)
705827bd09bSSatish Balay {
706827bd09bSSatish Balay   register int tmp=0;
707827bd09bSSatish Balay 
708827bd09bSSatish Balay 
709827bd09bSSatish Balay   /* should expand to full 32 bit */
710827bd09bSSatish Balay   while (n--)
711827bd09bSSatish Balay     {
712827bd09bSSatish Balay       if (*ptr&128) {tmp++;}
713827bd09bSSatish Balay       if (*ptr&64)  {tmp++;}
714827bd09bSSatish Balay       if (*ptr&32)  {tmp++;}
715827bd09bSSatish Balay       if (*ptr&16)  {tmp++;}
716827bd09bSSatish Balay       if (*ptr&8)   {tmp++;}
717827bd09bSSatish Balay       if (*ptr&4)   {tmp++;}
718827bd09bSSatish Balay       if (*ptr&2)   {tmp++;}
719827bd09bSSatish Balay       if (*ptr&1)   {tmp++;}
720827bd09bSSatish Balay       ptr++;
721827bd09bSSatish Balay     }
722827bd09bSSatish Balay 
723827bd09bSSatish Balay   return(tmp);
724827bd09bSSatish Balay }
725827bd09bSSatish Balay #endif
726827bd09bSSatish Balay 
727827bd09bSSatish Balay 
728827bd09bSSatish Balay /******************************************************************************
729827bd09bSSatish Balay Function: ivec_sort().
730827bd09bSSatish Balay 
731827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
732827bd09bSSatish Balay Output: sorted list (in ascending order).
733827bd09bSSatish Balay Return: none.
734827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
735827bd09bSSatish Balay ******************************************************************************/
736827bd09bSSatish Balay void
737827bd09bSSatish Balay ivec_sort(register int *ar, register int size)
738827bd09bSSatish Balay {
739827bd09bSSatish Balay   register int *pi, *pj, temp;
740827bd09bSSatish Balay   register int **top_a = (int **) offset_stack;
741827bd09bSSatish Balay   register int *top_s = size_stack, *bottom_s = size_stack;
742827bd09bSSatish Balay 
743827bd09bSSatish Balay 
744827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
745827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
746827bd09bSSatish Balay   size--;
747827bd09bSSatish Balay 
748827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
749827bd09bSSatish Balay   for (;;)
750827bd09bSSatish Balay     {
751827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
752827bd09bSSatish Balay       if (size > SORT_OPT)
753827bd09bSSatish Balay 	{
754827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
755827bd09bSSatish Balay 	  pi = ar+1;
756827bd09bSSatish Balay 	  pj = ar+size;
757827bd09bSSatish Balay 
758827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
759827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
760827bd09bSSatish Balay 
761827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
762827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
763827bd09bSSatish Balay 	  if (*pi > *pj)
764827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
765827bd09bSSatish Balay 	  if (*ar > *pj)
766827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
767827bd09bSSatish Balay 	  else if (*pi > *ar)
768827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
769827bd09bSSatish Balay 
770827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
771827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
772827bd09bSSatish Balay 	  for(;;)
773827bd09bSSatish Balay 	    {
774827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
775827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
776827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
777827bd09bSSatish Balay 
778827bd09bSSatish Balay 	      /* if we've crossed we're done */
779827bd09bSSatish Balay 	      if (pj<pi) break;
780827bd09bSSatish Balay 
781827bd09bSSatish Balay 	      /* else swap */
782827bd09bSSatish Balay 	      SWAP(*pi,*pj)
783827bd09bSSatish Balay 	    }
784827bd09bSSatish Balay 
785827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
786827bd09bSSatish Balay 	  SWAP(*ar,*pj)
787827bd09bSSatish Balay 
788827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
789827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
790827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");}
791827bd09bSSatish Balay 
792827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
793827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
794827bd09bSSatish Balay 	    {
795827bd09bSSatish Balay 	      *(top_a++) = pi;
796827bd09bSSatish Balay 	      size -= *top_s+2;
797827bd09bSSatish Balay 	      top_s++;
798827bd09bSSatish Balay 	    }
799827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
800827bd09bSSatish Balay 	  else if (size -= *top_s+2)
801827bd09bSSatish Balay 	    {;}
802827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
803827bd09bSSatish Balay 	  else
804827bd09bSSatish Balay 	    {
805827bd09bSSatish Balay 	      ar = *(--top_a);
806827bd09bSSatish Balay 	      size = *(--top_s);
807827bd09bSSatish Balay 	    }
808827bd09bSSatish Balay 	}
809827bd09bSSatish Balay 
810827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
811827bd09bSSatish Balay       else
812827bd09bSSatish Balay 	{
813827bd09bSSatish Balay 	  /* insertion sort for bottom */
814827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
815827bd09bSSatish Balay             {
816827bd09bSSatish Balay               temp = *pj;
817827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
818827bd09bSSatish Balay                 {
819827bd09bSSatish Balay                   if (*pi <= temp) break;
820827bd09bSSatish Balay                   *(pi+1)=*pi;
821827bd09bSSatish Balay                 }
822827bd09bSSatish Balay               *(pi+1)=temp;
823827bd09bSSatish Balay 	    }
824827bd09bSSatish Balay 
825827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
826827bd09bSSatish Balay 	  if (top_s==bottom_s) return;
827827bd09bSSatish Balay 
828827bd09bSSatish Balay 	  /* else pop another list from the stack */
829827bd09bSSatish Balay 	  ar = *(--top_a);
830827bd09bSSatish Balay 	  size = *(--top_s);
831827bd09bSSatish Balay 	}
832827bd09bSSatish Balay     }
833827bd09bSSatish Balay }
834827bd09bSSatish Balay 
835827bd09bSSatish Balay 
836827bd09bSSatish Balay 
837827bd09bSSatish Balay /******************************************************************************
838827bd09bSSatish Balay Function: ivec_sort_companion().
839827bd09bSSatish Balay 
840827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
841827bd09bSSatish Balay Output: sorted list (in ascending order).
842827bd09bSSatish Balay Return: none.
843827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
844827bd09bSSatish Balay ******************************************************************************/
845827bd09bSSatish Balay void
846827bd09bSSatish Balay ivec_sort_companion(register int *ar, register int *ar2, register int size)
847827bd09bSSatish Balay {
848827bd09bSSatish Balay   register int *pi, *pj, temp, temp2;
849827bd09bSSatish Balay   register int **top_a = (int **)offset_stack;
850827bd09bSSatish Balay   register int *top_s = size_stack, *bottom_s = size_stack;
851827bd09bSSatish Balay   register int *pi2, *pj2;
852827bd09bSSatish Balay   register int mid;
853827bd09bSSatish Balay 
854827bd09bSSatish Balay 
855827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
856827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
857827bd09bSSatish Balay   size--;
858827bd09bSSatish Balay 
859827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
860827bd09bSSatish Balay   for (;;)
861827bd09bSSatish Balay     {
862827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
863827bd09bSSatish Balay       if (size > SORT_OPT)
864827bd09bSSatish Balay 	{
865827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
866827bd09bSSatish Balay 	  mid = size>>1;
867827bd09bSSatish Balay 	  pi = ar+1;
868827bd09bSSatish Balay 	  pj = ar+mid;
869827bd09bSSatish Balay 	  pi2 = ar2+1;
870827bd09bSSatish Balay 	  pj2 = ar2+mid;
871827bd09bSSatish Balay 
872827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
873827bd09bSSatish Balay 	  SWAP(*pi,*pj)
874827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
875827bd09bSSatish Balay 
876827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
877827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
878827bd09bSSatish Balay 	  pj = ar+size;
879827bd09bSSatish Balay 	  pj2 = ar2+size;
880827bd09bSSatish Balay 	  if (*pi > *pj)
881827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
882827bd09bSSatish Balay 	  if (*ar > *pj)
883827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
884827bd09bSSatish Balay 	  else if (*pi > *ar)
885827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
886827bd09bSSatish Balay 
887827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
888827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
889827bd09bSSatish Balay 	  for(;;)
890827bd09bSSatish Balay 	    {
891827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
892827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
893827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
894827bd09bSSatish Balay 
895827bd09bSSatish Balay 	      /* if we've crossed we're done */
896827bd09bSSatish Balay 	      if (pj<pi) break;
897827bd09bSSatish Balay 
898827bd09bSSatish Balay 	      /* else swap */
899827bd09bSSatish Balay 	      SWAP(*pi,*pj)
900827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
901827bd09bSSatish Balay 	    }
902827bd09bSSatish Balay 
903827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
904827bd09bSSatish Balay 	  SWAP(*ar,*pj)
905827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
906827bd09bSSatish Balay 
907827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
908827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
909827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");}
910827bd09bSSatish Balay 
911827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
912827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
913827bd09bSSatish Balay 	    {
914827bd09bSSatish Balay 	      *(top_a++) = pi;
915827bd09bSSatish Balay 	      *(top_a++) = pi2;
916827bd09bSSatish Balay 	      size -= *top_s+2;
917827bd09bSSatish Balay 	      top_s++;
918827bd09bSSatish Balay 	    }
919827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
920827bd09bSSatish Balay 	  else if (size -= *top_s+2)
921827bd09bSSatish Balay 	    {;}
922827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
923827bd09bSSatish Balay 	  else
924827bd09bSSatish Balay 	    {
925827bd09bSSatish Balay 	      ar2 = *(--top_a);
926827bd09bSSatish Balay 	      ar  = *(--top_a);
927827bd09bSSatish Balay 	      size = *(--top_s);
928827bd09bSSatish Balay 	    }
929827bd09bSSatish Balay 	}
930827bd09bSSatish Balay 
931827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
932827bd09bSSatish Balay       else
933827bd09bSSatish Balay 	{
934827bd09bSSatish Balay 	  /* insertion sort for bottom */
935827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
936827bd09bSSatish Balay             {
937827bd09bSSatish Balay               temp = *pj;
938827bd09bSSatish Balay               temp2 = *pj2;
939827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
940827bd09bSSatish Balay                 {
941827bd09bSSatish Balay                   if (*pi <= temp) break;
942827bd09bSSatish Balay                   *(pi+1)=*pi;
943827bd09bSSatish Balay                   *(pi2+1)=*pi2;
944827bd09bSSatish Balay                 }
945827bd09bSSatish Balay               *(pi+1)=temp;
946827bd09bSSatish Balay               *(pi2+1)=temp2;
947827bd09bSSatish Balay 	    }
948827bd09bSSatish Balay 
949827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
950827bd09bSSatish Balay 	  if (top_s==bottom_s) return;
951827bd09bSSatish Balay 
952827bd09bSSatish Balay 	  /* else pop another list from the stack */
953827bd09bSSatish Balay 	  ar2 = *(--top_a);
954827bd09bSSatish Balay 	  ar  = *(--top_a);
955827bd09bSSatish Balay 	  size = *(--top_s);
956827bd09bSSatish Balay 	}
957827bd09bSSatish Balay     }
958827bd09bSSatish Balay }
959827bd09bSSatish Balay 
960827bd09bSSatish Balay 
961827bd09bSSatish Balay 
962827bd09bSSatish Balay /******************************************************************************
963827bd09bSSatish Balay Function: ivec_sort_companion_hack().
964827bd09bSSatish Balay 
965827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
966827bd09bSSatish Balay Output: sorted list (in ascending order).
967827bd09bSSatish Balay Return: none.
968827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
969827bd09bSSatish Balay ******************************************************************************/
970827bd09bSSatish Balay void
971827bd09bSSatish Balay ivec_sort_companion_hack(register int *ar, register int **ar2,
972827bd09bSSatish Balay 			 register int size)
973827bd09bSSatish Balay {
974827bd09bSSatish Balay   register int *pi, *pj, temp, *ptr;
975827bd09bSSatish Balay   register int **top_a = (int **)offset_stack;
976827bd09bSSatish Balay   register int *top_s = size_stack, *bottom_s = size_stack;
977827bd09bSSatish Balay   register int **pi2, **pj2;
978827bd09bSSatish Balay   register int mid;
979827bd09bSSatish Balay 
980827bd09bSSatish Balay 
981827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
982827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
983827bd09bSSatish Balay   size--;
984827bd09bSSatish Balay 
985827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
986827bd09bSSatish Balay   for (;;)
987827bd09bSSatish Balay     {
988827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
989827bd09bSSatish Balay       if (size > SORT_OPT)
990827bd09bSSatish Balay 	{
991827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
992827bd09bSSatish Balay 	  mid = size>>1;
993827bd09bSSatish Balay 	  pi = ar+1;
994827bd09bSSatish Balay 	  pj = ar+mid;
995827bd09bSSatish Balay 	  pi2 = ar2+1;
996827bd09bSSatish Balay 	  pj2 = ar2+mid;
997827bd09bSSatish Balay 
998827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
999827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1000827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1001827bd09bSSatish Balay 
1002827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1003827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1004827bd09bSSatish Balay 	  pj = ar+size;
1005827bd09bSSatish Balay 	  pj2 = ar2+size;
1006827bd09bSSatish Balay 	  if (*pi > *pj)
1007827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1008827bd09bSSatish Balay 	  if (*ar > *pj)
1009827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1010827bd09bSSatish Balay 	  else if (*pi > *ar)
1011827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1012827bd09bSSatish Balay 
1013827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1014827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1015827bd09bSSatish Balay 	  for(;;)
1016827bd09bSSatish Balay 	    {
1017827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1018827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1019827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1020827bd09bSSatish Balay 
1021827bd09bSSatish Balay 	      /* if we've crossed we're done */
1022827bd09bSSatish Balay 	      if (pj<pi) break;
1023827bd09bSSatish Balay 
1024827bd09bSSatish Balay 	      /* else swap */
1025827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1026827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1027827bd09bSSatish Balay 	    }
1028827bd09bSSatish Balay 
1029827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1030827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1031827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1032827bd09bSSatish Balay 
1033827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1034827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1035827bd09bSSatish Balay          {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");}
1036827bd09bSSatish Balay 
1037827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1038827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
1039827bd09bSSatish Balay 	    {
1040827bd09bSSatish Balay 	      *(top_a++) = pi;
1041827bd09bSSatish Balay 	      *(top_a++) = (int*) pi2;
1042827bd09bSSatish Balay 	      size -= *top_s+2;
1043827bd09bSSatish Balay 	      top_s++;
1044827bd09bSSatish Balay 	    }
1045827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1046827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1047827bd09bSSatish Balay 	    {;}
1048827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1049827bd09bSSatish Balay 	  else
1050827bd09bSSatish Balay 	    {
1051827bd09bSSatish Balay 	      ar2 = (int **) *(--top_a);
1052827bd09bSSatish Balay 	      ar  = *(--top_a);
1053827bd09bSSatish Balay 	      size = *(--top_s);
1054827bd09bSSatish Balay 	    }
1055827bd09bSSatish Balay 	}
1056827bd09bSSatish Balay 
1057827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1058827bd09bSSatish Balay       else
1059827bd09bSSatish Balay 	{
1060827bd09bSSatish Balay 	  /* insertion sort for bottom */
1061827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1062827bd09bSSatish Balay             {
1063827bd09bSSatish Balay               temp = *pj;
1064827bd09bSSatish Balay               ptr = *pj2;
1065827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1066827bd09bSSatish Balay                 {
1067827bd09bSSatish Balay                   if (*pi <= temp) break;
1068827bd09bSSatish Balay                   *(pi+1)=*pi;
1069827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1070827bd09bSSatish Balay                 }
1071827bd09bSSatish Balay               *(pi+1)=temp;
1072827bd09bSSatish Balay               *(pi2+1)=ptr;
1073827bd09bSSatish Balay 	    }
1074827bd09bSSatish Balay 
1075827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1076827bd09bSSatish Balay 	  if (top_s==bottom_s) return;
1077827bd09bSSatish Balay 
1078827bd09bSSatish Balay 	  /* else pop another list from the stack */
1079827bd09bSSatish Balay 	  ar2 = (int **)*(--top_a);
1080827bd09bSSatish Balay 	  ar  = *(--top_a);
1081827bd09bSSatish Balay 	  size = *(--top_s);
1082827bd09bSSatish Balay 	}
1083827bd09bSSatish Balay     }
1084827bd09bSSatish Balay }
1085827bd09bSSatish Balay 
1086827bd09bSSatish Balay 
1087827bd09bSSatish Balay 
1088827bd09bSSatish Balay /******************************************************************************
1089827bd09bSSatish Balay Function: SMI_sort().
1090827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1091827bd09bSSatish Balay Output: sorted list (in ascending order).
1092827bd09bSSatish Balay Return: none.
1093827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1094827bd09bSSatish Balay ******************************************************************************/
1095827bd09bSSatish Balay void
1096827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type)
1097827bd09bSSatish Balay {
1098827bd09bSSatish Balay   if (type == SORT_INTEGER)
1099827bd09bSSatish Balay     {
1100827bd09bSSatish Balay       if (ar2)
1101827bd09bSSatish Balay 	{ivec_sort_companion((int*)ar1,(int*)ar2,size);}
1102827bd09bSSatish Balay       else
1103827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1104827bd09bSSatish Balay     }
1105827bd09bSSatish Balay   else if (type == SORT_INT_PTR)
1106827bd09bSSatish Balay     {
1107827bd09bSSatish Balay       if (ar2)
1108827bd09bSSatish Balay 	{ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);}
1109827bd09bSSatish Balay       else
1110827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1111827bd09bSSatish Balay     }
1112827bd09bSSatish Balay 
1113827bd09bSSatish Balay   else
1114827bd09bSSatish Balay     {
1115827bd09bSSatish Balay       error_msg_fatal("SMI_sort only does SORT_INTEGER!");
1116827bd09bSSatish Balay     }
1117827bd09bSSatish Balay /*
1118827bd09bSSatish Balay   if (type == SORT_REAL)
1119827bd09bSSatish Balay     {
1120827bd09bSSatish Balay       if (ar2)
1121827bd09bSSatish Balay 	{rvec_sort_companion(ar2,ar1,size);}
1122827bd09bSSatish Balay       else
1123827bd09bSSatish Balay 	{rvec_sort(ar1,size);}
1124827bd09bSSatish Balay     }
1125827bd09bSSatish Balay */
1126827bd09bSSatish Balay }
1127827bd09bSSatish Balay 
1128827bd09bSSatish Balay 
1129827bd09bSSatish Balay 
1130827bd09bSSatish Balay /**********************************ivec.c**************************************
1131827bd09bSSatish Balay Function ivec_linear_search()
1132827bd09bSSatish Balay 
1133827bd09bSSatish Balay Input :
1134827bd09bSSatish Balay Output:
1135827bd09bSSatish Balay Return:
1136827bd09bSSatish Balay Description:
1137827bd09bSSatish Balay ***********************************ivec.c*************************************/
1138827bd09bSSatish Balay int
1139827bd09bSSatish Balay ivec_linear_search(register int item, register int *list, register int n)
1140827bd09bSSatish Balay {
1141827bd09bSSatish Balay   register int tmp = n-1;
1142827bd09bSSatish Balay 
1143827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
1144827bd09bSSatish Balay   return(-1);
1145827bd09bSSatish Balay }
1146827bd09bSSatish Balay 
1147827bd09bSSatish Balay 
1148827bd09bSSatish Balay 
1149827bd09bSSatish Balay /**********************************ivec.c**************************************
1150827bd09bSSatish Balay Function ivec_binary_search()
1151827bd09bSSatish Balay 
1152827bd09bSSatish Balay Input :
1153827bd09bSSatish Balay Output:
1154827bd09bSSatish Balay Return:
1155827bd09bSSatish Balay Description:
1156827bd09bSSatish Balay ***********************************ivec.c*************************************/
1157827bd09bSSatish Balay int
1158827bd09bSSatish Balay ivec_binary_search(register int item, register int *list, register int rh)
1159827bd09bSSatish Balay {
1160827bd09bSSatish Balay   register int mid, lh=0;
1161827bd09bSSatish Balay 
1162827bd09bSSatish Balay   rh--;
1163827bd09bSSatish Balay   while (lh<=rh)
1164827bd09bSSatish Balay     {
1165827bd09bSSatish Balay       mid = (lh+rh)>>1;
1166827bd09bSSatish Balay       if (*(list+mid) == item)
1167827bd09bSSatish Balay 	{return(mid);}
1168827bd09bSSatish Balay       if (*(list+mid) > item)
1169827bd09bSSatish Balay 	{rh = mid-1;}
1170827bd09bSSatish Balay       else
1171827bd09bSSatish Balay 	{lh = mid+1;}
1172827bd09bSSatish Balay     }
1173827bd09bSSatish Balay   return(-1);
1174827bd09bSSatish Balay }
1175827bd09bSSatish Balay 
1176827bd09bSSatish Balay 
1177827bd09bSSatish Balay 
1178827bd09bSSatish Balay /**********************************ivec.c**************************************
1179827bd09bSSatish Balay Function rvec_dump
1180827bd09bSSatish Balay 
1181827bd09bSSatish Balay Input :
1182827bd09bSSatish Balay Output:
1183827bd09bSSatish Balay Return:
1184827bd09bSSatish Balay Description:
1185827bd09bSSatish Balay ***********************************ivec.c*************************************/
1186827bd09bSSatish Balay void
1187827bd09bSSatish Balay rvec_dump(REAL *v, int n, int tag, int tag2, char * s)
1188827bd09bSSatish Balay {
1189827bd09bSSatish Balay   int i;
1190827bd09bSSatish Balay   printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id);
1191827bd09bSSatish Balay   for (i=0;i<n;i++)
1192827bd09bSSatish Balay     {printf("%f ",v[i]);}
1193827bd09bSSatish Balay   printf("\n");
1194827bd09bSSatish Balay   fflush(stdout);
1195827bd09bSSatish Balay }
1196827bd09bSSatish Balay 
1197827bd09bSSatish Balay 
1198827bd09bSSatish Balay 
1199827bd09bSSatish Balay /**********************************ivec.c**************************************
1200827bd09bSSatish Balay Function rvec_lb_ub()
1201827bd09bSSatish Balay 
1202827bd09bSSatish Balay Input :
1203827bd09bSSatish Balay Output:
1204827bd09bSSatish Balay Return:
1205827bd09bSSatish Balay Description:
1206827bd09bSSatish Balay ***********************************ivec.c*************************************/
1207827bd09bSSatish Balay void
1208827bd09bSSatish Balay rvec_lb_ub(register REAL *arg1, register int n, REAL *lb, REAL *ub)
1209827bd09bSSatish Balay {
1210827bd09bSSatish Balay   register REAL min =  REAL_MAX;
1211827bd09bSSatish Balay   register REAL max = -REAL_MAX;
1212827bd09bSSatish Balay 
1213827bd09bSSatish Balay   while (n--)
1214827bd09bSSatish Balay     {
1215827bd09bSSatish Balay      min = MIN(min,*arg1);
1216827bd09bSSatish Balay      max = MAX(max,*arg1);
1217827bd09bSSatish Balay      arg1++;
1218827bd09bSSatish Balay     }
1219827bd09bSSatish Balay 
1220827bd09bSSatish Balay   *lb=min;
1221827bd09bSSatish Balay   *ub=max;
1222827bd09bSSatish Balay }
1223827bd09bSSatish Balay 
1224827bd09bSSatish Balay 
1225827bd09bSSatish Balay 
1226827bd09bSSatish Balay /********************************ivec.c**************************************
1227827bd09bSSatish Balay Function rvec_copy()
1228827bd09bSSatish Balay 
1229827bd09bSSatish Balay Input :
1230827bd09bSSatish Balay Output:
1231827bd09bSSatish Balay Return:
1232827bd09bSSatish Balay Description:
1233827bd09bSSatish Balay *********************************ivec.c*************************************/
1234827bd09bSSatish Balay void
1235827bd09bSSatish Balay rvec_copy(register REAL *arg1, register REAL *arg2, register int n)
1236827bd09bSSatish Balay {
1237827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
1238827bd09bSSatish Balay }
1239827bd09bSSatish Balay 
1240827bd09bSSatish Balay 
1241827bd09bSSatish Balay 
1242827bd09bSSatish Balay /********************************ivec.c**************************************
1243827bd09bSSatish Balay Function rvec_zero()
1244827bd09bSSatish Balay 
1245827bd09bSSatish Balay Input :
1246827bd09bSSatish Balay Output:
1247827bd09bSSatish Balay Return:
1248827bd09bSSatish Balay Description:
1249827bd09bSSatish Balay *********************************ivec.c*************************************/
1250827bd09bSSatish Balay void
1251827bd09bSSatish Balay rvec_zero(register REAL *arg1, register int n)
1252827bd09bSSatish Balay {
1253827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
1254827bd09bSSatish Balay }
1255827bd09bSSatish Balay 
1256827bd09bSSatish Balay 
1257827bd09bSSatish Balay 
1258827bd09bSSatish Balay /**********************************ivec.c**************************************
1259827bd09bSSatish Balay Function rvec_one()
1260827bd09bSSatish Balay 
1261827bd09bSSatish Balay Input :
1262827bd09bSSatish Balay Output:
1263827bd09bSSatish Balay Return:
1264827bd09bSSatish Balay Description:
1265827bd09bSSatish Balay ***********************************ivec.c*************************************/
1266827bd09bSSatish Balay void
1267827bd09bSSatish Balay rvec_one(register REAL *arg1, register int n)
1268827bd09bSSatish Balay {
1269827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
1270827bd09bSSatish Balay }
1271827bd09bSSatish Balay 
1272827bd09bSSatish Balay 
1273827bd09bSSatish Balay 
1274827bd09bSSatish Balay /**********************************ivec.c**************************************
1275827bd09bSSatish Balay Function rvec_neg_one()
1276827bd09bSSatish Balay 
1277827bd09bSSatish Balay Input :
1278827bd09bSSatish Balay Output:
1279827bd09bSSatish Balay Return:
1280827bd09bSSatish Balay Description:
1281827bd09bSSatish Balay ***********************************ivec.c*************************************/
1282827bd09bSSatish Balay void
1283827bd09bSSatish Balay rvec_neg_one(register REAL *arg1, register int n)
1284827bd09bSSatish Balay {
1285827bd09bSSatish Balay   while (n--)  {*arg1++ = -1.0;}
1286827bd09bSSatish Balay }
1287827bd09bSSatish Balay 
1288827bd09bSSatish Balay 
1289827bd09bSSatish Balay 
1290827bd09bSSatish Balay /**********************************ivec.c**************************************
1291827bd09bSSatish Balay Function rvec_set()
1292827bd09bSSatish Balay 
1293827bd09bSSatish Balay Input :
1294827bd09bSSatish Balay Output:
1295827bd09bSSatish Balay Return:
1296827bd09bSSatish Balay Description:
1297827bd09bSSatish Balay ***********************************ivec.c*************************************/
1298827bd09bSSatish Balay void
1299827bd09bSSatish Balay rvec_set(register REAL *arg1, register REAL arg2, register int n)
1300827bd09bSSatish Balay {
1301827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
1302827bd09bSSatish Balay }
1303827bd09bSSatish Balay 
1304827bd09bSSatish Balay 
1305827bd09bSSatish Balay 
1306827bd09bSSatish Balay /**********************************ivec.c**************************************
1307827bd09bSSatish Balay Function rvec_scale()
1308827bd09bSSatish Balay 
1309827bd09bSSatish Balay Input :
1310827bd09bSSatish Balay Output:
1311827bd09bSSatish Balay Return:
1312827bd09bSSatish Balay Description:
1313827bd09bSSatish Balay ***********************************ivec.c*************************************/
1314827bd09bSSatish Balay void
1315827bd09bSSatish Balay rvec_scale(register REAL *arg1, register REAL arg2, register int n)
1316827bd09bSSatish Balay {
1317827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
1318827bd09bSSatish Balay }
1319827bd09bSSatish Balay 
1320827bd09bSSatish Balay 
1321827bd09bSSatish Balay 
1322827bd09bSSatish Balay /********************************ivec.c**************************************
1323827bd09bSSatish Balay Function rvec_add()
1324827bd09bSSatish Balay 
1325827bd09bSSatish Balay Input :
1326827bd09bSSatish Balay Output:
1327827bd09bSSatish Balay Return:
1328827bd09bSSatish Balay Description:
1329827bd09bSSatish Balay *********************************ivec.c*************************************/
1330827bd09bSSatish Balay void
1331827bd09bSSatish Balay rvec_add(register REAL *arg1, register REAL *arg2, register int n)
1332827bd09bSSatish Balay {
1333827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
1334827bd09bSSatish Balay }
1335827bd09bSSatish Balay 
1336827bd09bSSatish Balay 
1337827bd09bSSatish Balay 
1338827bd09bSSatish Balay /********************************ivec.c**************************************
1339827bd09bSSatish Balay Function rvec_dot()
1340827bd09bSSatish Balay 
1341827bd09bSSatish Balay Input :
1342827bd09bSSatish Balay Output:
1343827bd09bSSatish Balay Return:
1344827bd09bSSatish Balay Description:
1345827bd09bSSatish Balay *********************************ivec.c*************************************/
1346827bd09bSSatish Balay REAL
1347827bd09bSSatish Balay rvec_dot(register REAL *arg1, register REAL *arg2, register int n)
1348827bd09bSSatish Balay {
1349827bd09bSSatish Balay   REAL dot=0.0;
1350827bd09bSSatish Balay 
1351827bd09bSSatish Balay   while (n--)  {dot+= *arg1++ * *arg2++;}
1352827bd09bSSatish Balay 
1353827bd09bSSatish Balay   return(dot);
1354827bd09bSSatish Balay }
1355827bd09bSSatish Balay 
1356827bd09bSSatish Balay 
1357827bd09bSSatish Balay 
1358827bd09bSSatish Balay /********************************ivec.c**************************************
1359827bd09bSSatish Balay Function rvec_axpy()
1360827bd09bSSatish Balay 
1361827bd09bSSatish Balay Input :
1362827bd09bSSatish Balay Output:
1363827bd09bSSatish Balay Return:
1364827bd09bSSatish Balay Description:
1365827bd09bSSatish Balay *********************************ivec.c*************************************/
1366827bd09bSSatish Balay void
1367827bd09bSSatish Balay rvec_axpy(register REAL *arg1, register REAL *arg2, register REAL scale,
1368827bd09bSSatish Balay 	  register int n)
1369827bd09bSSatish Balay {
1370827bd09bSSatish Balay   while (n--)  {*arg1++ += scale * *arg2++;}
1371827bd09bSSatish Balay }
1372827bd09bSSatish Balay 
1373827bd09bSSatish Balay 
1374827bd09bSSatish Balay /********************************ivec.c**************************************
1375827bd09bSSatish Balay Function rvec_mult()
1376827bd09bSSatish Balay 
1377827bd09bSSatish Balay Input :
1378827bd09bSSatish Balay Output:
1379827bd09bSSatish Balay Return:
1380827bd09bSSatish Balay Description:
1381827bd09bSSatish Balay *********************************ivec.c*************************************/
1382827bd09bSSatish Balay void
1383827bd09bSSatish Balay rvec_mult(register REAL *arg1, register REAL *arg2, register int n)
1384827bd09bSSatish Balay {
1385827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
1386827bd09bSSatish Balay }
1387827bd09bSSatish Balay 
1388827bd09bSSatish Balay 
1389827bd09bSSatish Balay 
1390827bd09bSSatish Balay /********************************ivec.c**************************************
1391827bd09bSSatish Balay Function rvec_max()
1392827bd09bSSatish Balay 
1393827bd09bSSatish Balay Input :
1394827bd09bSSatish Balay Output:
1395827bd09bSSatish Balay Return:
1396827bd09bSSatish Balay Description:
1397827bd09bSSatish Balay *********************************ivec.c*************************************/
1398827bd09bSSatish Balay void
1399827bd09bSSatish Balay rvec_max(register REAL *arg1, register REAL *arg2, register int n)
1400827bd09bSSatish Balay {
1401827bd09bSSatish Balay   while (n--)  {*arg1 = MAX(*arg1,*arg2); arg1++; arg2++;}
1402827bd09bSSatish Balay }
1403827bd09bSSatish Balay 
1404827bd09bSSatish Balay 
1405827bd09bSSatish Balay 
1406827bd09bSSatish Balay /********************************ivec.c**************************************
1407827bd09bSSatish Balay Function rvec_max_abs()
1408827bd09bSSatish Balay 
1409827bd09bSSatish Balay Input :
1410827bd09bSSatish Balay Output:
1411827bd09bSSatish Balay Return:
1412827bd09bSSatish Balay Description:
1413827bd09bSSatish Balay *********************************ivec.c*************************************/
1414827bd09bSSatish Balay void
1415827bd09bSSatish Balay rvec_max_abs(register REAL *arg1, register REAL *arg2, register int n)
1416827bd09bSSatish Balay {
1417827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
1418827bd09bSSatish Balay }
1419827bd09bSSatish Balay 
1420827bd09bSSatish Balay 
1421827bd09bSSatish Balay 
1422827bd09bSSatish Balay /********************************ivec.c**************************************
1423827bd09bSSatish Balay Function rvec_min()
1424827bd09bSSatish Balay 
1425827bd09bSSatish Balay Input :
1426827bd09bSSatish Balay Output:
1427827bd09bSSatish Balay Return:
1428827bd09bSSatish Balay Description:
1429827bd09bSSatish Balay *********************************ivec.c*************************************/
1430827bd09bSSatish Balay void
1431827bd09bSSatish Balay rvec_min(register REAL *arg1, register REAL *arg2, register int n)
1432827bd09bSSatish Balay {
1433827bd09bSSatish Balay   while (n--)  {*arg1 = MIN(*arg1,*arg2); arg1++; arg2++;}
1434827bd09bSSatish Balay }
1435827bd09bSSatish Balay 
1436827bd09bSSatish Balay 
1437827bd09bSSatish Balay 
1438827bd09bSSatish Balay /********************************ivec.c**************************************
1439827bd09bSSatish Balay Function rvec_min_abs()
1440827bd09bSSatish Balay 
1441827bd09bSSatish Balay Input :
1442827bd09bSSatish Balay Output:
1443827bd09bSSatish Balay Return:
1444827bd09bSSatish Balay Description:
1445827bd09bSSatish Balay *********************************ivec.c*************************************/
1446827bd09bSSatish Balay void
1447827bd09bSSatish Balay rvec_min_abs(register REAL *arg1, register REAL *arg2, register int n)
1448827bd09bSSatish Balay {
1449827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
1450827bd09bSSatish Balay }
1451827bd09bSSatish Balay 
1452827bd09bSSatish Balay 
1453827bd09bSSatish Balay 
1454827bd09bSSatish Balay /********************************ivec.c**************************************
1455827bd09bSSatish Balay Function rvec_exists()
1456827bd09bSSatish Balay 
1457827bd09bSSatish Balay Input :
1458827bd09bSSatish Balay Output:
1459827bd09bSSatish Balay Return:
1460827bd09bSSatish Balay Description:
1461827bd09bSSatish Balay *********************************ivec.c*************************************/
1462827bd09bSSatish Balay void
1463827bd09bSSatish Balay rvec_exists(register REAL *arg1, register REAL *arg2, register int n)
1464827bd09bSSatish Balay {
1465827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
1466827bd09bSSatish Balay }
1467827bd09bSSatish Balay 
1468827bd09bSSatish Balay 
1469827bd09bSSatish Balay 
1470827bd09bSSatish Balay /**********************************ivec.c**************************************
1471827bd09bSSatish Balay Function rvec_non_uniform()
1472827bd09bSSatish Balay 
1473827bd09bSSatish Balay Input :
1474827bd09bSSatish Balay Output:
1475827bd09bSSatish Balay Return:
1476827bd09bSSatish Balay Description:
1477827bd09bSSatish Balay ***********************************ivec.c*************************************/
1478827bd09bSSatish Balay void
1479827bd09bSSatish Balay rvec_non_uniform(REAL *arg1, REAL *arg2, register int n, register int *arg3)
1480827bd09bSSatish Balay {
1481827bd09bSSatish Balay   register int i, j, type;
1482827bd09bSSatish Balay 
1483827bd09bSSatish Balay 
1484827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
1485827bd09bSSatish Balay   for (i=0;i<n;)
1486827bd09bSSatish Balay     {
1487827bd09bSSatish Balay       /* clump 'em for now */
1488827bd09bSSatish Balay       j=i+1;
1489827bd09bSSatish Balay       type = arg3[i];
1490827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
1491827bd09bSSatish Balay 	{j++;}
1492827bd09bSSatish Balay 
1493827bd09bSSatish Balay       /* how many together */
1494827bd09bSSatish Balay       j -= i;
1495827bd09bSSatish Balay 
1496827bd09bSSatish Balay       /* call appropriate ivec function */
1497827bd09bSSatish Balay       if (type == GL_MAX)
1498827bd09bSSatish Balay 	{rvec_max(arg1,arg2,j);}
1499827bd09bSSatish Balay       else if (type == GL_MIN)
1500827bd09bSSatish Balay 	{rvec_min(arg1,arg2,j);}
1501827bd09bSSatish Balay       else if (type == GL_MULT)
1502827bd09bSSatish Balay 	{rvec_mult(arg1,arg2,j);}
1503827bd09bSSatish Balay       else if (type == GL_ADD)
1504827bd09bSSatish Balay 	{rvec_add(arg1,arg2,j);}
1505827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
1506827bd09bSSatish Balay 	{rvec_max_abs(arg1,arg2,j);}
1507827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
1508827bd09bSSatish Balay 	{rvec_min_abs(arg1,arg2,j);}
1509827bd09bSSatish Balay       else if (type == GL_EXISTS)
1510827bd09bSSatish Balay 	{rvec_exists(arg1,arg2,j);}
1511827bd09bSSatish Balay       else
1512827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");}
1513827bd09bSSatish Balay 
1514827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
1515827bd09bSSatish Balay     }
1516827bd09bSSatish Balay }
1517827bd09bSSatish Balay 
1518827bd09bSSatish Balay 
1519827bd09bSSatish Balay 
1520827bd09bSSatish Balay /**********************************ivec.c**************************************
1521827bd09bSSatish Balay Function rvec_fct_addr()
1522827bd09bSSatish Balay 
1523827bd09bSSatish Balay Input :
1524827bd09bSSatish Balay Output:
1525827bd09bSSatish Balay Return:
1526827bd09bSSatish Balay Description:
1527827bd09bSSatish Balay ***********************************ivec.c*************************************/
1528827bd09bSSatish Balay vfp rvec_fct_addr(register int type)
1529827bd09bSSatish Balay {
1530827bd09bSSatish Balay   if (type == NON_UNIFORM)
1531827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_non_uniform);}
1532827bd09bSSatish Balay   else if (type == GL_MAX)
1533827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_max);}
1534827bd09bSSatish Balay   else if (type == GL_MIN)
1535827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_min);}
1536827bd09bSSatish Balay   else if (type == GL_MULT)
1537827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_mult);}
1538827bd09bSSatish Balay   else if (type == GL_ADD)
1539827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_add);}
1540827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
1541827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_max_abs);}
1542827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
1543827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_min_abs);}
1544827bd09bSSatish Balay   else if (type == GL_EXISTS)
1545827bd09bSSatish Balay     {return((void (*)(void*, void *, int, ...))&rvec_exists);}
1546827bd09bSSatish Balay 
1547827bd09bSSatish Balay   /* catch all ... not good if we get here */
1548827bd09bSSatish Balay   return(NULL);
1549827bd09bSSatish Balay }
1550827bd09bSSatish Balay 
1551827bd09bSSatish Balay 
1552827bd09bSSatish Balay /******************************************************************************
1553827bd09bSSatish Balay Function: my_sort().
1554827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1555827bd09bSSatish Balay Output: sorted list (in ascending order).
1556827bd09bSSatish Balay Return: none.
1557827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1558827bd09bSSatish Balay ******************************************************************************/
1559827bd09bSSatish Balay void
1560827bd09bSSatish Balay rvec_sort(register REAL *ar, register int Size)
1561827bd09bSSatish Balay {
1562827bd09bSSatish Balay   register REAL *pi, *pj, temp;
1563827bd09bSSatish Balay   register REAL **top_a = (REAL **)offset_stack;
1564827bd09bSSatish Balay   register PTRINT *top_s = psize_stack, *bottom_s = psize_stack;
1565827bd09bSSatish Balay   register PTRINT size = (PTRINT) Size;
1566827bd09bSSatish Balay 
1567827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1568827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1569827bd09bSSatish Balay   size--;
1570827bd09bSSatish Balay 
1571827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1572827bd09bSSatish Balay   for (;;)
1573827bd09bSSatish Balay     {
1574827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1575827bd09bSSatish Balay       if (size > SORT_OPT)
1576827bd09bSSatish Balay 	{
1577827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1578827bd09bSSatish Balay 	  pi = ar+1;
1579827bd09bSSatish Balay 	  pj = ar+size;
1580827bd09bSSatish Balay 
1581827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1582827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
1583827bd09bSSatish Balay 
1584827bd09bSSatish Balay 	  pj = ar+size;
1585827bd09bSSatish Balay 
1586827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1587827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1588827bd09bSSatish Balay 	  if (*pi > *pj)
1589827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
1590827bd09bSSatish Balay 	  if (*ar > *pj)
1591827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
1592827bd09bSSatish Balay 	  else if (*pi > *ar)
1593827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
1594827bd09bSSatish Balay 
1595827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1596827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1597827bd09bSSatish Balay 	  for(;;)
1598827bd09bSSatish Balay 	    {
1599827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1600827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
1601827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
1602827bd09bSSatish Balay 
1603827bd09bSSatish Balay 	      /* if we've crossed we're done */
1604827bd09bSSatish Balay 	      if (pj<pi) break;
1605827bd09bSSatish Balay 
1606827bd09bSSatish Balay 	      /* else swap */
1607827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1608827bd09bSSatish Balay 	    }
1609827bd09bSSatish Balay 
1610827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1611827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1612827bd09bSSatish Balay 
1613827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1614827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1615827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1616827bd09bSSatish Balay 
1617827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1618827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1619827bd09bSSatish Balay 	    {
1620827bd09bSSatish Balay 	      *(top_a++) = pi;
1621827bd09bSSatish Balay 	      size -= *top_s+2;
1622827bd09bSSatish Balay 	      top_s++;
1623827bd09bSSatish Balay 	    }
1624827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1625827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1626827bd09bSSatish Balay 	    {;}
1627827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1628827bd09bSSatish Balay 	  else
1629827bd09bSSatish Balay 	    {
1630827bd09bSSatish Balay 	      ar = *(--top_a);
1631827bd09bSSatish Balay 	      size = *(--top_s);
1632827bd09bSSatish Balay 	    }
1633827bd09bSSatish Balay 	}
1634827bd09bSSatish Balay 
1635827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1636827bd09bSSatish Balay       else
1637827bd09bSSatish Balay 	{
1638827bd09bSSatish Balay 	  /* insertion sort for bottom */
1639827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
1640827bd09bSSatish Balay             {
1641827bd09bSSatish Balay               temp = *pj;
1642827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
1643827bd09bSSatish Balay                 {
1644827bd09bSSatish Balay                   if (*pi <= temp) break;
1645827bd09bSSatish Balay                   *(pi+1)=*pi;
1646827bd09bSSatish Balay                 }
1647827bd09bSSatish Balay               *(pi+1)=temp;
1648827bd09bSSatish Balay 	    }
1649827bd09bSSatish Balay 
1650827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1651827bd09bSSatish Balay 	  if (top_s==bottom_s) return;
1652827bd09bSSatish Balay 
1653827bd09bSSatish Balay 	  /* else pop another list from the stack */
1654827bd09bSSatish Balay 	  ar = *(--top_a);
1655827bd09bSSatish Balay 	  size = *(--top_s);
1656827bd09bSSatish Balay 	}
1657827bd09bSSatish Balay     }
1658827bd09bSSatish Balay }
1659827bd09bSSatish Balay 
1660827bd09bSSatish Balay 
1661827bd09bSSatish Balay 
1662827bd09bSSatish Balay /******************************************************************************
1663827bd09bSSatish Balay Function: my_sort().
1664827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1665827bd09bSSatish Balay Output: sorted list (in ascending order).
1666827bd09bSSatish Balay Return: none.
1667827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1668827bd09bSSatish Balay ******************************************************************************/
1669827bd09bSSatish Balay void
1670827bd09bSSatish Balay rvec_sort_companion(register REAL *ar, register int *ar2, register int Size)
1671827bd09bSSatish Balay {
1672827bd09bSSatish Balay   register REAL *pi, *pj, temp;
1673827bd09bSSatish Balay   register REAL **top_a = (REAL **)offset_stack;
1674827bd09bSSatish Balay   register PTRINT *top_s = psize_stack, *bottom_s = psize_stack;
1675827bd09bSSatish Balay   register PTRINT size = (PTRINT) Size;
1676827bd09bSSatish Balay 
1677827bd09bSSatish Balay   register int *pi2, *pj2;
1678827bd09bSSatish Balay   register int ptr;
1679827bd09bSSatish Balay   register PTRINT mid;
1680827bd09bSSatish Balay 
1681827bd09bSSatish Balay 
1682827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1683827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1684827bd09bSSatish Balay   size--;
1685827bd09bSSatish Balay 
1686827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1687827bd09bSSatish Balay   for (;;)
1688827bd09bSSatish Balay     {
1689827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1690827bd09bSSatish Balay       if (size > SORT_OPT)
1691827bd09bSSatish Balay 	{
1692827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1693827bd09bSSatish Balay 	  mid = size>>1;
1694827bd09bSSatish Balay 	  pi = ar+1;
1695827bd09bSSatish Balay 	  pj = ar+mid;
1696827bd09bSSatish Balay 	  pi2 = ar2+1;
1697827bd09bSSatish Balay 	  pj2 = ar2+mid;
1698827bd09bSSatish Balay 
1699827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1700827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1701827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1702827bd09bSSatish Balay 
1703827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1704827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1705827bd09bSSatish Balay 	  pj = ar+size;
1706827bd09bSSatish Balay 	  pj2 = ar2+size;
1707827bd09bSSatish Balay 	  if (*pi > *pj)
1708827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1709827bd09bSSatish Balay 	  if (*ar > *pj)
1710827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1711827bd09bSSatish Balay 	  else if (*pi > *ar)
1712827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1713827bd09bSSatish Balay 
1714827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1715827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1716827bd09bSSatish Balay 	  for(;;)
1717827bd09bSSatish Balay 	    {
1718827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1719827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1720827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1721827bd09bSSatish Balay 
1722827bd09bSSatish Balay 	      /* if we've crossed we're done */
1723827bd09bSSatish Balay 	      if (pj<pi) break;
1724827bd09bSSatish Balay 
1725827bd09bSSatish Balay 	      /* else swap */
1726827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1727827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1728827bd09bSSatish Balay 	    }
1729827bd09bSSatish Balay 
1730827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1731827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1732827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1733827bd09bSSatish Balay 
1734827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1735827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1736827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1737827bd09bSSatish Balay 
1738827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1739827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1740827bd09bSSatish Balay 	    {
1741827bd09bSSatish Balay 	      *(top_a++) = pi;
1742827bd09bSSatish Balay 	      *(top_a++) = (REAL *) pi2;
1743827bd09bSSatish Balay 	      size -= *top_s+2;
1744827bd09bSSatish Balay 	      top_s++;
1745827bd09bSSatish Balay 	    }
1746827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1747827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1748827bd09bSSatish Balay 	    {;}
1749827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1750827bd09bSSatish Balay 	  else
1751827bd09bSSatish Balay 	    {
1752827bd09bSSatish Balay 	      ar2 = (int*) *(--top_a);
1753827bd09bSSatish Balay 	      ar  = *(--top_a);
1754827bd09bSSatish Balay 	      size = *(--top_s);
1755827bd09bSSatish Balay 	    }
1756827bd09bSSatish Balay 	}
1757827bd09bSSatish Balay 
1758827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1759827bd09bSSatish Balay       else
1760827bd09bSSatish Balay 	{
1761827bd09bSSatish Balay 	  /* insertion sort for bottom */
1762827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1763827bd09bSSatish Balay             {
1764827bd09bSSatish Balay               temp = *pj;
1765827bd09bSSatish Balay               ptr = *pj2;
1766827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1767827bd09bSSatish Balay                 {
1768827bd09bSSatish Balay                   if (*pi <= temp) break;
1769827bd09bSSatish Balay                   *(pi+1)=*pi;
1770827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1771827bd09bSSatish Balay                 }
1772827bd09bSSatish Balay               *(pi+1)=temp;
1773827bd09bSSatish Balay               *(pi2+1)=ptr;
1774827bd09bSSatish Balay 	    }
1775827bd09bSSatish Balay 
1776827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1777827bd09bSSatish Balay 	  if (top_s==bottom_s) return;
1778827bd09bSSatish Balay 
1779827bd09bSSatish Balay 	  /* else pop another list from the stack */
1780827bd09bSSatish Balay 	  ar2 = (int*) *(--top_a);
1781827bd09bSSatish Balay 	  ar  = *(--top_a);
1782827bd09bSSatish Balay 	  size = *(--top_s);
1783827bd09bSSatish Balay 	}
1784827bd09bSSatish Balay     }
1785827bd09bSSatish Balay }
1786827bd09bSSatish Balay 
1787827bd09bSSatish Balay 
1788827bd09bSSatish Balay 
1789827bd09bSSatish Balay 
1790827bd09bSSatish Balay 
1791827bd09bSSatish Balay /**********************************ivec.c**************************************
1792827bd09bSSatish Balay Function ivec_binary_search()
1793827bd09bSSatish Balay 
1794827bd09bSSatish Balay Input :
1795827bd09bSSatish Balay Output:
1796827bd09bSSatish Balay Return:
1797827bd09bSSatish Balay Description:
1798827bd09bSSatish Balay ***********************************ivec.c*************************************/
1799827bd09bSSatish Balay int
1800827bd09bSSatish Balay rvec_binary_search(register REAL item, register REAL *list, register int rh)
1801827bd09bSSatish Balay {
1802827bd09bSSatish Balay   register int mid, lh=0;
1803827bd09bSSatish Balay 
1804827bd09bSSatish Balay   rh--;
1805827bd09bSSatish Balay   while (lh<=rh)
1806827bd09bSSatish Balay     {
1807827bd09bSSatish Balay       mid = (lh+rh)>>1;
1808827bd09bSSatish Balay       if (*(list+mid) == item)
1809827bd09bSSatish Balay 	{return(mid);}
1810827bd09bSSatish Balay       if (*(list+mid) > item)
1811827bd09bSSatish Balay 	{rh = mid-1;}
1812827bd09bSSatish Balay       else
1813827bd09bSSatish Balay 	{lh = mid+1;}
1814827bd09bSSatish Balay     }
1815827bd09bSSatish Balay   return(-1);
1816827bd09bSSatish Balay }
1817827bd09bSSatish Balay 
1818827bd09bSSatish Balay 
1819827bd09bSSatish Balay 
1820827bd09bSSatish Balay 
1821827bd09bSSatish Balay 
1822