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