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