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