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