xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 3fdc574633ecfb9f9c88298fd518f98ace9368d9)
1dba47a55SKris 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*************************************/
45*3fdc5746SBarry Smith PetscErrorCode
46827bd09bSSatish Balay ivec_dump(int *v, int n, int tag, int tag2, char * s)
47827bd09bSSatish Balay {
48827bd09bSSatish Balay   int i;
49*3fdc5746SBarry Smith   PetscFunctionBegin;
50827bd09bSSatish Balay   printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id);
51827bd09bSSatish Balay   for (i=0;i<n;i++)
52827bd09bSSatish Balay     {printf("%2d ",v[i]);}
53827bd09bSSatish Balay   printf("\n");
54827bd09bSSatish Balay   fflush(stdout);
55*3fdc5746SBarry Smith   PetscFunctionReturn(0);
56827bd09bSSatish Balay }
57827bd09bSSatish Balay 
58827bd09bSSatish Balay 
59827bd09bSSatish Balay 
60827bd09bSSatish Balay /**********************************ivec.c**************************************
61827bd09bSSatish Balay Function ivec_lb_ub()
62827bd09bSSatish Balay 
63827bd09bSSatish Balay Input :
64827bd09bSSatish Balay Output:
65827bd09bSSatish Balay Return:
66827bd09bSSatish Balay Description:
67827bd09bSSatish Balay ***********************************ivec.c*************************************/
68*3fdc5746SBarry Smith PetscErrorCode
69a501084fSBarry Smith ivec_lb_ub( int *arg1,  int n, int *lb, int *ub)
70827bd09bSSatish Balay {
71a501084fSBarry Smith    int min = INT_MAX;
72a501084fSBarry Smith    int max = INT_MIN;
73827bd09bSSatish Balay 
74*3fdc5746SBarry Smith   PetscFunctionBegin;
75827bd09bSSatish Balay   while (n--)
76827bd09bSSatish Balay     {
7739945688SSatish Balay      min = PetscMin(min,*arg1);
7839945688SSatish Balay      max = PetscMax(max,*arg1);
79827bd09bSSatish Balay      arg1++;
80827bd09bSSatish Balay     }
81827bd09bSSatish Balay 
82827bd09bSSatish Balay   *lb=min;
83827bd09bSSatish Balay   *ub=max;
84*3fdc5746SBarry Smith   PetscFunctionReturn(0);
85827bd09bSSatish Balay }
86827bd09bSSatish Balay 
87827bd09bSSatish Balay 
88827bd09bSSatish Balay 
89827bd09bSSatish Balay /**********************************ivec.c**************************************
90827bd09bSSatish Balay Function ivec_copy()
91827bd09bSSatish Balay 
92827bd09bSSatish Balay Input :
93827bd09bSSatish Balay Output:
94827bd09bSSatish Balay Return:
95827bd09bSSatish Balay Description:
96827bd09bSSatish Balay ***********************************ivec.c*************************************/
97a501084fSBarry Smith int *ivec_copy( int *arg1,  int *arg2,  int n)
98827bd09bSSatish Balay {
99827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
100827bd09bSSatish Balay   return(arg1);
101827bd09bSSatish Balay }
102827bd09bSSatish Balay 
103827bd09bSSatish Balay 
104827bd09bSSatish Balay 
105827bd09bSSatish Balay /**********************************ivec.c**************************************
106827bd09bSSatish Balay Function ivec_zero()
107827bd09bSSatish Balay 
108827bd09bSSatish Balay Input :
109827bd09bSSatish Balay Output:
110827bd09bSSatish Balay Return:
111827bd09bSSatish Balay Description:
112827bd09bSSatish Balay ***********************************ivec.c*************************************/
113*3fdc5746SBarry Smith PetscErrorCode
114a501084fSBarry Smith ivec_zero( int *arg1,  int n)
115827bd09bSSatish Balay {
116*3fdc5746SBarry Smith   PetscFunctionBegin;
117827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
118*3fdc5746SBarry Smith   PetscFunctionReturn(0);
119827bd09bSSatish Balay }
120827bd09bSSatish Balay 
121827bd09bSSatish Balay 
122827bd09bSSatish Balay 
123827bd09bSSatish Balay /**********************************ivec.c**************************************
124827bd09bSSatish Balay Function ivec_comp()
125827bd09bSSatish Balay 
126827bd09bSSatish Balay Input :
127827bd09bSSatish Balay Output:
128827bd09bSSatish Balay Return:
129827bd09bSSatish Balay Description:
130827bd09bSSatish Balay ***********************************ivec.c*************************************/
131*3fdc5746SBarry Smith PetscErrorCode
132a501084fSBarry Smith ivec_comp( int *arg1,  int n)
133827bd09bSSatish Balay {
134*3fdc5746SBarry Smith   PetscFunctionBegin;
135827bd09bSSatish Balay   while (n--)  {*arg1 = ~*arg1; arg1++;}
136*3fdc5746SBarry Smith   PetscFunctionReturn(0);
137827bd09bSSatish Balay }
138827bd09bSSatish Balay 
139827bd09bSSatish Balay 
140827bd09bSSatish Balay 
141827bd09bSSatish Balay /**********************************ivec.c**************************************
142827bd09bSSatish Balay Function ivec_neg_one()
143827bd09bSSatish Balay 
144827bd09bSSatish Balay Input :
145827bd09bSSatish Balay Output:
146827bd09bSSatish Balay Return:
147827bd09bSSatish Balay Description:
148827bd09bSSatish Balay ***********************************ivec.c*************************************/
149*3fdc5746SBarry Smith PetscErrorCode
150a501084fSBarry Smith ivec_neg_one( int *arg1,  int n)
151827bd09bSSatish Balay {
152*3fdc5746SBarry Smith   PetscFunctionBegin;
153827bd09bSSatish Balay   while (n--)  {*arg1++ = -1;}
154*3fdc5746SBarry Smith   PetscFunctionReturn(0);
155827bd09bSSatish Balay }
156827bd09bSSatish Balay 
157827bd09bSSatish Balay 
158827bd09bSSatish Balay 
159827bd09bSSatish Balay /**********************************ivec.c**************************************
160827bd09bSSatish Balay Function ivec_pos_one()
161827bd09bSSatish Balay 
162827bd09bSSatish Balay Input :
163827bd09bSSatish Balay Output:
164827bd09bSSatish Balay Return:
165827bd09bSSatish Balay Description:
166827bd09bSSatish Balay ***********************************ivec.c*************************************/
167*3fdc5746SBarry Smith PetscErrorCode
168a501084fSBarry Smith ivec_pos_one( int *arg1,  int n)
169827bd09bSSatish Balay {
170*3fdc5746SBarry Smith   PetscFunctionBegin;
171827bd09bSSatish Balay   while (n--)  {*arg1++ = 1;}
172*3fdc5746SBarry Smith   PetscFunctionReturn(0);
173827bd09bSSatish Balay }
174827bd09bSSatish Balay 
175827bd09bSSatish Balay 
176827bd09bSSatish Balay 
177827bd09bSSatish Balay /**********************************ivec.c**************************************
178827bd09bSSatish Balay Function ivec_c_index()
179827bd09bSSatish Balay 
180827bd09bSSatish Balay Input :
181827bd09bSSatish Balay Output:
182827bd09bSSatish Balay Return:
183827bd09bSSatish Balay Description:
184827bd09bSSatish Balay ***********************************ivec.c*************************************/
185*3fdc5746SBarry Smith PetscErrorCode
186a501084fSBarry Smith ivec_c_index( int *arg1,  int n)
187827bd09bSSatish Balay {
188a501084fSBarry Smith    int i=0;
189827bd09bSSatish Balay 
190*3fdc5746SBarry Smith   PetscFunctionBegin;
191827bd09bSSatish Balay   while (n--)  {*arg1++ = i++;}
192*3fdc5746SBarry Smith   PetscFunctionReturn(0);
193827bd09bSSatish Balay }
194827bd09bSSatish Balay 
195827bd09bSSatish Balay 
196827bd09bSSatish Balay 
197827bd09bSSatish Balay /**********************************ivec.c**************************************
198827bd09bSSatish Balay Function ivec_fortran_index()
199827bd09bSSatish Balay 
200827bd09bSSatish Balay Input :
201827bd09bSSatish Balay Output:
202827bd09bSSatish Balay Return:
203827bd09bSSatish Balay Description:
204827bd09bSSatish Balay ***********************************ivec.c*************************************/
205*3fdc5746SBarry Smith PetscErrorCode
206a501084fSBarry Smith ivec_fortran_index( int *arg1,  int n)
207827bd09bSSatish Balay {
208a501084fSBarry Smith    int i=0;
209827bd09bSSatish Balay 
210*3fdc5746SBarry Smith   PetscFunctionBegin;
211827bd09bSSatish Balay   while (n--)  {*arg1++ = ++i;}
212*3fdc5746SBarry Smith   PetscFunctionReturn(0);
213827bd09bSSatish Balay }
214827bd09bSSatish Balay 
215827bd09bSSatish Balay 
216827bd09bSSatish Balay 
217827bd09bSSatish Balay /**********************************ivec.c**************************************
218827bd09bSSatish Balay Function ivec_set()
219827bd09bSSatish Balay 
220827bd09bSSatish Balay Input :
221827bd09bSSatish Balay Output:
222827bd09bSSatish Balay Return:
223827bd09bSSatish Balay Description:
224827bd09bSSatish Balay ***********************************ivec.c*************************************/
225*3fdc5746SBarry Smith PetscErrorCode
226a501084fSBarry Smith ivec_set( int *arg1,  int arg2,  int n)
227827bd09bSSatish Balay {
228*3fdc5746SBarry Smith   PetscFunctionBegin;
229827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
230*3fdc5746SBarry Smith   PetscFunctionReturn(0);
231827bd09bSSatish Balay }
232827bd09bSSatish Balay 
233827bd09bSSatish Balay 
234827bd09bSSatish Balay 
235827bd09bSSatish Balay /**********************************ivec.c**************************************
236827bd09bSSatish Balay Function ivec_cmp()
237827bd09bSSatish Balay 
238827bd09bSSatish Balay Input :
239827bd09bSSatish Balay Output:
240827bd09bSSatish Balay Return:
241827bd09bSSatish Balay Description:
242827bd09bSSatish Balay ***********************************ivec.c*************************************/
243827bd09bSSatish Balay int
244a501084fSBarry Smith ivec_cmp( int *arg1,  int *arg2,  int n)
245827bd09bSSatish Balay {
246*3fdc5746SBarry Smith   PetscFunctionBegin;
247827bd09bSSatish Balay   while (n--)  {if (*arg1++ != *arg2++)  {return(FALSE);}}
248827bd09bSSatish Balay   return(TRUE);
249827bd09bSSatish Balay }
250827bd09bSSatish Balay 
251827bd09bSSatish Balay 
252827bd09bSSatish Balay 
253827bd09bSSatish Balay /**********************************ivec.c**************************************
254827bd09bSSatish Balay Function ivec_max()
255827bd09bSSatish Balay 
256827bd09bSSatish Balay Input :
257827bd09bSSatish Balay Output:
258827bd09bSSatish Balay Return:
259827bd09bSSatish Balay Description:
260827bd09bSSatish Balay ***********************************ivec.c*************************************/
261*3fdc5746SBarry Smith PetscErrorCode
262a501084fSBarry Smith ivec_max( int *arg1,  int *arg2,  int n)
263827bd09bSSatish Balay {
264*3fdc5746SBarry Smith   PetscFunctionBegin;
26539945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
266*3fdc5746SBarry Smith   PetscFunctionReturn(0);
267827bd09bSSatish Balay }
268827bd09bSSatish Balay 
269827bd09bSSatish Balay 
270827bd09bSSatish Balay 
271827bd09bSSatish Balay /**********************************ivec.c**************************************
272827bd09bSSatish Balay Function ivec_min()
273827bd09bSSatish Balay 
274827bd09bSSatish Balay Input :
275827bd09bSSatish Balay Output:
276827bd09bSSatish Balay Return:
277827bd09bSSatish Balay Description:
278827bd09bSSatish Balay ***********************************ivec.c*************************************/
279*3fdc5746SBarry Smith PetscErrorCode
280a501084fSBarry Smith ivec_min( int *arg1,  int *arg2,  int n)
281827bd09bSSatish Balay {
282*3fdc5746SBarry Smith   PetscFunctionBegin;
28339945688SSatish Balay   while (n--)  {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;}
284*3fdc5746SBarry Smith   PetscFunctionReturn(0);
285827bd09bSSatish Balay }
286827bd09bSSatish Balay 
287827bd09bSSatish Balay 
288827bd09bSSatish Balay 
289827bd09bSSatish Balay /**********************************ivec.c**************************************
290827bd09bSSatish Balay Function ivec_mult()
291827bd09bSSatish Balay 
292827bd09bSSatish Balay Input :
293827bd09bSSatish Balay Output:
294827bd09bSSatish Balay Return:
295827bd09bSSatish Balay Description:
296827bd09bSSatish Balay ***********************************ivec.c*************************************/
297*3fdc5746SBarry Smith PetscErrorCode
298a501084fSBarry Smith ivec_mult( int *arg1,  int *arg2,  int n)
299827bd09bSSatish Balay {
300*3fdc5746SBarry Smith   PetscFunctionBegin;
301827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
302*3fdc5746SBarry Smith   PetscFunctionReturn(0);
303827bd09bSSatish Balay }
304827bd09bSSatish Balay 
305827bd09bSSatish Balay 
306827bd09bSSatish Balay 
307827bd09bSSatish Balay /**********************************ivec.c**************************************
308827bd09bSSatish Balay Function ivec_add()
309827bd09bSSatish Balay 
310827bd09bSSatish Balay Input :
311827bd09bSSatish Balay Output:
312827bd09bSSatish Balay Return:
313827bd09bSSatish Balay Description:
314827bd09bSSatish Balay ***********************************ivec.c*************************************/
315*3fdc5746SBarry Smith PetscErrorCode
316a501084fSBarry Smith ivec_add( int *arg1,  int *arg2,  int n)
317827bd09bSSatish Balay {
318*3fdc5746SBarry Smith   PetscFunctionBegin;
319827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
320*3fdc5746SBarry Smith   PetscFunctionReturn(0);
321827bd09bSSatish Balay }
322827bd09bSSatish Balay 
323827bd09bSSatish Balay 
324827bd09bSSatish Balay 
325827bd09bSSatish Balay /**********************************ivec.c**************************************
326827bd09bSSatish Balay Function ivec_lxor()
327827bd09bSSatish Balay 
328827bd09bSSatish Balay Input :
329827bd09bSSatish Balay Output:
330827bd09bSSatish Balay Return:
331827bd09bSSatish Balay Description:
332827bd09bSSatish Balay ***********************************ivec.c*************************************/
333*3fdc5746SBarry Smith PetscErrorCode
334a501084fSBarry Smith ivec_lxor( int *arg1,  int *arg2,  int n)
335827bd09bSSatish Balay {
336*3fdc5746SBarry Smith   PetscFunctionBegin;
337827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
338*3fdc5746SBarry Smith   PetscFunctionReturn(0);
339827bd09bSSatish Balay }
340827bd09bSSatish Balay 
341827bd09bSSatish Balay 
342827bd09bSSatish Balay 
343827bd09bSSatish Balay /**********************************ivec.c**************************************
344827bd09bSSatish Balay Function ivec_xor()
345827bd09bSSatish Balay 
346827bd09bSSatish Balay Input :
347827bd09bSSatish Balay Output:
348827bd09bSSatish Balay Return:
349827bd09bSSatish Balay Description:
350827bd09bSSatish Balay ***********************************ivec.c*************************************/
351*3fdc5746SBarry Smith PetscErrorCode
352a501084fSBarry Smith ivec_xor( int *arg1,  int *arg2,  int n)
353827bd09bSSatish Balay {
354*3fdc5746SBarry Smith   PetscFunctionBegin;
355827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
356*3fdc5746SBarry Smith   PetscFunctionReturn(0);
357827bd09bSSatish Balay }
358827bd09bSSatish Balay 
359827bd09bSSatish Balay 
360827bd09bSSatish Balay 
361827bd09bSSatish Balay /**********************************ivec.c**************************************
362827bd09bSSatish Balay Function ivec_or()
363827bd09bSSatish Balay 
364827bd09bSSatish Balay Input :
365827bd09bSSatish Balay Output:
366827bd09bSSatish Balay Return:
367827bd09bSSatish Balay Description:
368827bd09bSSatish Balay ***********************************ivec.c*************************************/
369*3fdc5746SBarry Smith PetscErrorCode
370a501084fSBarry Smith ivec_or( int *arg1,  int *arg2,  int n)
371827bd09bSSatish Balay {
372*3fdc5746SBarry Smith   PetscFunctionBegin;
373827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
374*3fdc5746SBarry Smith   PetscFunctionReturn(0);
375827bd09bSSatish Balay }
376827bd09bSSatish Balay 
377827bd09bSSatish Balay 
378827bd09bSSatish Balay 
379827bd09bSSatish Balay /**********************************ivec.c**************************************
380827bd09bSSatish Balay Function ivec_lor()
381827bd09bSSatish Balay 
382827bd09bSSatish Balay Input :
383827bd09bSSatish Balay Output:
384827bd09bSSatish Balay Return:
385827bd09bSSatish Balay Description:
386827bd09bSSatish Balay ***********************************ivec.c*************************************/
387*3fdc5746SBarry Smith PetscErrorCode
388a501084fSBarry Smith ivec_lor( int *arg1,  int *arg2,  int n)
389827bd09bSSatish Balay {
390*3fdc5746SBarry Smith   PetscFunctionBegin;
391827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
392*3fdc5746SBarry Smith   PetscFunctionReturn(0);
393827bd09bSSatish Balay }
394827bd09bSSatish Balay 
395827bd09bSSatish Balay 
396827bd09bSSatish Balay 
397827bd09bSSatish Balay /**********************************ivec.c**************************************
398827bd09bSSatish Balay Function ivec_or3()
399827bd09bSSatish Balay 
400827bd09bSSatish Balay Input :
401827bd09bSSatish Balay Output:
402827bd09bSSatish Balay Return:
403827bd09bSSatish Balay Description:
404827bd09bSSatish Balay ***********************************ivec.c*************************************/
405*3fdc5746SBarry Smith PetscErrorCode
406a501084fSBarry Smith ivec_or3( int *arg1,  int *arg2,  int *arg3,
407a501084fSBarry Smith 	  int n)
408827bd09bSSatish Balay {
409*3fdc5746SBarry Smith   PetscFunctionBegin;
410827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ | *arg3++);}
411*3fdc5746SBarry Smith   PetscFunctionReturn(0);
412827bd09bSSatish Balay }
413827bd09bSSatish Balay 
414827bd09bSSatish Balay 
415827bd09bSSatish Balay 
416827bd09bSSatish Balay /**********************************ivec.c**************************************
417827bd09bSSatish Balay Function ivec_and()
418827bd09bSSatish Balay 
419827bd09bSSatish Balay Input :
420827bd09bSSatish Balay Output:
421827bd09bSSatish Balay Return:
422827bd09bSSatish Balay Description:
423827bd09bSSatish Balay ***********************************ivec.c*************************************/
424*3fdc5746SBarry Smith PetscErrorCode
425a501084fSBarry Smith ivec_and( int *arg1,  int *arg2,  int n)
426827bd09bSSatish Balay {
427*3fdc5746SBarry Smith   PetscFunctionBegin;
428827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
429*3fdc5746SBarry Smith   PetscFunctionReturn(0);
430827bd09bSSatish Balay }
431827bd09bSSatish Balay 
432827bd09bSSatish Balay 
433827bd09bSSatish Balay 
434827bd09bSSatish Balay /**********************************ivec.c**************************************
435827bd09bSSatish Balay Function ivec_land()
436827bd09bSSatish Balay 
437827bd09bSSatish Balay Input :
438827bd09bSSatish Balay Output:
439827bd09bSSatish Balay Return:
440827bd09bSSatish Balay Description:
441827bd09bSSatish Balay ***********************************ivec.c*************************************/
442*3fdc5746SBarry Smith PetscErrorCode
443a501084fSBarry Smith ivec_land( int *arg1,  int *arg2,  int n)
444827bd09bSSatish Balay {
445*3fdc5746SBarry Smith   PetscFunctionBegin;
446827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
447*3fdc5746SBarry Smith   PetscFunctionReturn(0);
448827bd09bSSatish Balay }
449827bd09bSSatish Balay 
450827bd09bSSatish Balay 
451827bd09bSSatish Balay 
452827bd09bSSatish Balay /**********************************ivec.c**************************************
453827bd09bSSatish Balay Function ivec_and3()
454827bd09bSSatish Balay 
455827bd09bSSatish Balay Input :
456827bd09bSSatish Balay Output:
457827bd09bSSatish Balay Return:
458827bd09bSSatish Balay Description:
459827bd09bSSatish Balay ***********************************ivec.c*************************************/
460*3fdc5746SBarry Smith PetscErrorCode
461a501084fSBarry Smith ivec_and3( int *arg1,  int *arg2,  int *arg3,
462a501084fSBarry Smith 	   int n)
463827bd09bSSatish Balay {
464*3fdc5746SBarry Smith   PetscFunctionBegin;
465827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
466*3fdc5746SBarry Smith   PetscFunctionReturn(0);
467827bd09bSSatish Balay }
468827bd09bSSatish Balay 
469827bd09bSSatish Balay 
470827bd09bSSatish Balay 
471827bd09bSSatish Balay /**********************************ivec.c**************************************
472827bd09bSSatish Balay Function ivec_sum
473827bd09bSSatish Balay 
474827bd09bSSatish Balay Input :
475827bd09bSSatish Balay Output:
476827bd09bSSatish Balay Return:
477827bd09bSSatish Balay Description:
478827bd09bSSatish Balay ***********************************ivec.c*************************************/
479a501084fSBarry Smith int ivec_sum( int *arg1,  int n)
480827bd09bSSatish Balay {
481a501084fSBarry Smith    int tmp = 0;
482827bd09bSSatish Balay 
483827bd09bSSatish Balay 
484827bd09bSSatish Balay   while (n--) {tmp += *arg1++;}
485827bd09bSSatish Balay   return(tmp);
486827bd09bSSatish Balay }
487827bd09bSSatish Balay 
488827bd09bSSatish Balay 
489827bd09bSSatish Balay 
490827bd09bSSatish Balay /**********************************ivec.c**************************************
491827bd09bSSatish Balay Function ivec_reduce_and
492827bd09bSSatish Balay 
493827bd09bSSatish Balay Input :
494827bd09bSSatish Balay Output:
495827bd09bSSatish Balay Return:
496827bd09bSSatish Balay Description:
497827bd09bSSatish Balay ***********************************ivec.c*************************************/
498a501084fSBarry Smith int ivec_reduce_and( int *arg1,  int n)
499827bd09bSSatish Balay {
500a501084fSBarry Smith    int tmp = ALL_ONES;
501827bd09bSSatish Balay 
502827bd09bSSatish Balay 
503827bd09bSSatish Balay   while (n--) {tmp &= *arg1++;}
504827bd09bSSatish Balay   return(tmp);
505827bd09bSSatish Balay }
506827bd09bSSatish Balay 
507827bd09bSSatish Balay 
508827bd09bSSatish Balay 
509827bd09bSSatish Balay /**********************************ivec.c**************************************
510827bd09bSSatish Balay Function ivec_reduce_or
511827bd09bSSatish Balay 
512827bd09bSSatish Balay Input :
513827bd09bSSatish Balay Output:
514827bd09bSSatish Balay Return:
515827bd09bSSatish Balay Description:
516827bd09bSSatish Balay ***********************************ivec.c*************************************/
517a501084fSBarry Smith int ivec_reduce_or( int *arg1,  int n)
518827bd09bSSatish Balay {
519a501084fSBarry Smith    int tmp = 0;
520827bd09bSSatish Balay 
521827bd09bSSatish Balay 
522827bd09bSSatish Balay   while (n--) {tmp |= *arg1++;}
523827bd09bSSatish Balay   return(tmp);
524827bd09bSSatish Balay }
525827bd09bSSatish Balay 
526827bd09bSSatish Balay 
527827bd09bSSatish Balay 
528827bd09bSSatish Balay /**********************************ivec.c**************************************
529827bd09bSSatish Balay Function ivec_prod
530827bd09bSSatish Balay 
531827bd09bSSatish Balay Input :
532827bd09bSSatish Balay Output:
533827bd09bSSatish Balay Return:
534827bd09bSSatish Balay Description:
535827bd09bSSatish Balay ***********************************ivec.c*************************************/
536a501084fSBarry Smith int ivec_prod( int *arg1,  int n)
537827bd09bSSatish Balay {
538a501084fSBarry Smith    int tmp = 1;
539827bd09bSSatish Balay 
540827bd09bSSatish Balay 
541827bd09bSSatish Balay   while (n--)  {tmp *= *arg1++;}
542827bd09bSSatish Balay   return(tmp);
543827bd09bSSatish Balay }
544827bd09bSSatish Balay 
545827bd09bSSatish Balay 
546827bd09bSSatish Balay 
547827bd09bSSatish Balay /**********************************ivec.c**************************************
548827bd09bSSatish Balay Function ivec_u_sum
549827bd09bSSatish Balay 
550827bd09bSSatish Balay Input :
551827bd09bSSatish Balay Output:
552827bd09bSSatish Balay Return:
553827bd09bSSatish Balay Description:
554827bd09bSSatish Balay ***********************************ivec.c*************************************/
555a501084fSBarry Smith int ivec_u_sum( unsigned *arg1,  int n)
556827bd09bSSatish Balay {
557a501084fSBarry Smith    unsigned tmp = 0;
558827bd09bSSatish Balay 
559827bd09bSSatish Balay 
560827bd09bSSatish Balay   while (n--)  {tmp += *arg1++;}
561827bd09bSSatish Balay   return(tmp);
562827bd09bSSatish Balay }
563827bd09bSSatish Balay 
564827bd09bSSatish Balay 
565827bd09bSSatish Balay 
566827bd09bSSatish Balay /**********************************ivec.c**************************************
567827bd09bSSatish Balay Function ivec_lb()
568827bd09bSSatish Balay 
569827bd09bSSatish Balay Input :
570827bd09bSSatish Balay Output:
571827bd09bSSatish Balay Return:
572827bd09bSSatish Balay Description:
573827bd09bSSatish Balay ***********************************ivec.c*************************************/
574827bd09bSSatish Balay int
575a501084fSBarry Smith ivec_lb( int *arg1,  int n)
576827bd09bSSatish Balay {
577a501084fSBarry Smith    int min = INT_MAX;
578827bd09bSSatish Balay 
579827bd09bSSatish Balay 
58039945688SSatish Balay   while (n--)  {min = PetscMin(min,*arg1); arg1++;}
581827bd09bSSatish Balay   return(min);
582827bd09bSSatish Balay }
583827bd09bSSatish Balay 
584827bd09bSSatish Balay 
585827bd09bSSatish Balay 
586827bd09bSSatish Balay /**********************************ivec.c**************************************
587827bd09bSSatish Balay Function ivec_ub()
588827bd09bSSatish Balay 
589827bd09bSSatish Balay Input :
590827bd09bSSatish Balay Output:
591827bd09bSSatish Balay Return:
592827bd09bSSatish Balay Description:
593827bd09bSSatish Balay ***********************************ivec.c*************************************/
594827bd09bSSatish Balay int
595a501084fSBarry Smith ivec_ub( int *arg1,  int n)
596827bd09bSSatish Balay {
597a501084fSBarry Smith    int max = INT_MIN;
598827bd09bSSatish Balay 
599827bd09bSSatish Balay 
60039945688SSatish Balay   while (n--)  {max = PetscMax(max,*arg1); arg1++;}
601827bd09bSSatish Balay   return(max);
602827bd09bSSatish Balay }
603827bd09bSSatish Balay 
604827bd09bSSatish Balay 
605827bd09bSSatish Balay 
606827bd09bSSatish Balay /**********************************ivec.c**************************************
607827bd09bSSatish Balay Function split_buf()
608827bd09bSSatish Balay 
609827bd09bSSatish Balay Input :
610827bd09bSSatish Balay Output:
611827bd09bSSatish Balay Return:
612827bd09bSSatish Balay Description:
613827bd09bSSatish Balay 
614827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!!
615827bd09bSSatish Balay ***********************************ivec.c*************************************/
616827bd09bSSatish Balay int
617a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2,  int size)
618827bd09bSSatish Balay {
619827bd09bSSatish Balay   *buf2 = (buf1 + (size>>3));
620827bd09bSSatish Balay   return(size);
621827bd09bSSatish Balay }
622827bd09bSSatish Balay 
623827bd09bSSatish Balay 
624827bd09bSSatish Balay 
625827bd09bSSatish Balay /**********************************ivec.c**************************************
626827bd09bSSatish Balay Function ivec_non_uniform()
627827bd09bSSatish Balay 
628827bd09bSSatish Balay Input :
629827bd09bSSatish Balay Output:
630827bd09bSSatish Balay Return:
631827bd09bSSatish Balay Description:
632827bd09bSSatish Balay ***********************************ivec.c*************************************/
633*3fdc5746SBarry Smith PetscErrorCode
634a501084fSBarry Smith ivec_non_uniform(int *arg1, int *arg2,  int n,  int *arg3)
635827bd09bSSatish Balay {
636a501084fSBarry Smith    int i, j, type;
637827bd09bSSatish Balay 
638827bd09bSSatish Balay 
639*3fdc5746SBarry Smith   PetscFunctionBegin;
640827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
641827bd09bSSatish Balay   for (i=0;i<n;)
642827bd09bSSatish Balay     {
643827bd09bSSatish Balay       /* clump 'em for now */
644827bd09bSSatish Balay       j=i+1;
645827bd09bSSatish Balay       type = arg3[i];
646827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
647827bd09bSSatish Balay 	{j++;}
648827bd09bSSatish Balay 
649827bd09bSSatish Balay       /* how many together */
650827bd09bSSatish Balay       j -= i;
651827bd09bSSatish Balay 
652827bd09bSSatish Balay       /* call appropriate ivec function */
653827bd09bSSatish Balay       if (type == GL_MAX)
654827bd09bSSatish Balay 	{ivec_max(arg1,arg2,j);}
655827bd09bSSatish Balay       else if (type == GL_MIN)
656827bd09bSSatish Balay 	{ivec_min(arg1,arg2,j);}
657827bd09bSSatish Balay       else if (type == GL_MULT)
658827bd09bSSatish Balay 	{ivec_mult(arg1,arg2,j);}
659827bd09bSSatish Balay       else if (type == GL_ADD)
660827bd09bSSatish Balay 	{ivec_add(arg1,arg2,j);}
661827bd09bSSatish Balay       else if (type == GL_B_XOR)
662827bd09bSSatish Balay 	{ivec_xor(arg1,arg2,j);}
663827bd09bSSatish Balay       else if (type == GL_B_OR)
664827bd09bSSatish Balay 	{ivec_or(arg1,arg2,j);}
665827bd09bSSatish Balay       else if (type == GL_B_AND)
666827bd09bSSatish Balay 	{ivec_and(arg1,arg2,j);}
667827bd09bSSatish Balay       else if (type == GL_L_XOR)
668827bd09bSSatish Balay 	{ivec_lxor(arg1,arg2,j);}
669827bd09bSSatish Balay       else if (type == GL_L_OR)
670827bd09bSSatish Balay 	{ivec_lor(arg1,arg2,j);}
671827bd09bSSatish Balay       else if (type == GL_L_AND)
672827bd09bSSatish Balay 	{ivec_land(arg1,arg2,j);}
673827bd09bSSatish Balay       else
674827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");}
675827bd09bSSatish Balay 
676827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
677827bd09bSSatish Balay     }
678*3fdc5746SBarry Smith   PetscFunctionReturn(0);
679827bd09bSSatish Balay }
680827bd09bSSatish Balay 
681827bd09bSSatish Balay 
682827bd09bSSatish Balay 
683827bd09bSSatish Balay /**********************************ivec.c**************************************
684827bd09bSSatish Balay Function ivec_addr()
685827bd09bSSatish Balay 
686827bd09bSSatish Balay Input :
687827bd09bSSatish Balay Output:
688827bd09bSSatish Balay Return:
689827bd09bSSatish Balay Description:
690827bd09bSSatish Balay ***********************************ivec.c*************************************/
691a501084fSBarry Smith vfp ivec_fct_addr( int type)
692827bd09bSSatish Balay {
693*3fdc5746SBarry Smith   PetscFunctionBegin;
694827bd09bSSatish Balay   if (type == NON_UNIFORM)
695*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);}
696827bd09bSSatish Balay   else if (type == GL_MAX)
697*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);}
698827bd09bSSatish Balay   else if (type == GL_MIN)
699*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);}
700827bd09bSSatish Balay   else if (type == GL_MULT)
701*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);}
702827bd09bSSatish Balay   else if (type == GL_ADD)
703*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);}
704827bd09bSSatish Balay   else if (type == GL_B_XOR)
705*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);}
706827bd09bSSatish Balay   else if (type == GL_B_OR)
707*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);}
708827bd09bSSatish Balay   else if (type == GL_B_AND)
709*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);}
710827bd09bSSatish Balay   else if (type == GL_L_XOR)
711*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);}
712827bd09bSSatish Balay   else if (type == GL_L_OR)
713*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);}
714827bd09bSSatish Balay   else if (type == GL_L_AND)
715*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);}
716827bd09bSSatish Balay 
717827bd09bSSatish Balay   /* catch all ... not good if we get here */
718827bd09bSSatish Balay   return(NULL);
719827bd09bSSatish Balay }
720827bd09bSSatish Balay 
721827bd09bSSatish Balay 
722827bd09bSSatish Balay /**********************************ivec.c**************************************
723827bd09bSSatish Balay Function ct_bits()
724827bd09bSSatish Balay 
725827bd09bSSatish Balay Input :
726827bd09bSSatish Balay Output:
727827bd09bSSatish Balay Return:
728827bd09bSSatish Balay Description: MUST FIX THIS!!!
729827bd09bSSatish Balay ***********************************ivec.c*************************************/
730827bd09bSSatish Balay #if defined(notusing)
731827bd09bSSatish Balay static
732827bd09bSSatish Balay int
733a501084fSBarry Smith ivec_ct_bits( int *ptr,  int n)
734827bd09bSSatish Balay {
735a501084fSBarry Smith    int tmp=0;
736827bd09bSSatish Balay 
737827bd09bSSatish Balay 
738827bd09bSSatish Balay   /* should expand to full 32 bit */
739827bd09bSSatish Balay   while (n--)
740827bd09bSSatish Balay     {
741827bd09bSSatish Balay       if (*ptr&128) {tmp++;}
742827bd09bSSatish Balay       if (*ptr&64)  {tmp++;}
743827bd09bSSatish Balay       if (*ptr&32)  {tmp++;}
744827bd09bSSatish Balay       if (*ptr&16)  {tmp++;}
745827bd09bSSatish Balay       if (*ptr&8)   {tmp++;}
746827bd09bSSatish Balay       if (*ptr&4)   {tmp++;}
747827bd09bSSatish Balay       if (*ptr&2)   {tmp++;}
748827bd09bSSatish Balay       if (*ptr&1)   {tmp++;}
749827bd09bSSatish Balay       ptr++;
750827bd09bSSatish Balay     }
751827bd09bSSatish Balay 
752827bd09bSSatish Balay   return(tmp);
753827bd09bSSatish Balay }
754827bd09bSSatish Balay #endif
755827bd09bSSatish Balay 
756827bd09bSSatish Balay 
757827bd09bSSatish Balay /******************************************************************************
758827bd09bSSatish Balay Function: ivec_sort().
759827bd09bSSatish Balay 
760827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
761827bd09bSSatish Balay Output: sorted list (in ascending order).
762827bd09bSSatish Balay Return: none.
763827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
764827bd09bSSatish Balay ******************************************************************************/
765*3fdc5746SBarry Smith PetscErrorCode
766a501084fSBarry Smith ivec_sort( int *ar,  int size)
767827bd09bSSatish Balay {
768a501084fSBarry Smith    int *pi, *pj, temp;
769a501084fSBarry Smith    int **top_a = (int **) offset_stack;
770a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
771827bd09bSSatish Balay 
772827bd09bSSatish Balay 
773827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
774827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
775827bd09bSSatish Balay   size--;
776827bd09bSSatish Balay 
777827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
778827bd09bSSatish Balay   for (;;)
779827bd09bSSatish Balay     {
780827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
781827bd09bSSatish Balay       if (size > SORT_OPT)
782827bd09bSSatish Balay 	{
783827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
784827bd09bSSatish Balay 	  pi = ar+1;
785827bd09bSSatish Balay 	  pj = ar+size;
786827bd09bSSatish Balay 
787827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
788827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
789827bd09bSSatish Balay 
790827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
791827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
792827bd09bSSatish Balay 	  if (*pi > *pj)
793827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
794827bd09bSSatish Balay 	  if (*ar > *pj)
795827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
796827bd09bSSatish Balay 	  else if (*pi > *ar)
797827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
798827bd09bSSatish Balay 
799827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
800827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
801827bd09bSSatish Balay 	  for(;;)
802827bd09bSSatish Balay 	    {
803827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
804827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
805827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
806827bd09bSSatish Balay 
807827bd09bSSatish Balay 	      /* if we've crossed we're done */
808827bd09bSSatish Balay 	      if (pj<pi) break;
809827bd09bSSatish Balay 
810827bd09bSSatish Balay 	      /* else swap */
811827bd09bSSatish Balay 	      SWAP(*pi,*pj)
812827bd09bSSatish Balay 	    }
813827bd09bSSatish Balay 
814827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
815827bd09bSSatish Balay 	  SWAP(*ar,*pj)
816827bd09bSSatish Balay 
817827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
818827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
819827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");}
820827bd09bSSatish Balay 
821827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
822827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
823827bd09bSSatish Balay 	    {
824827bd09bSSatish Balay 	      *(top_a++) = pi;
825827bd09bSSatish Balay 	      size -= *top_s+2;
826827bd09bSSatish Balay 	      top_s++;
827827bd09bSSatish Balay 	    }
828827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
829827bd09bSSatish Balay 	  else if (size -= *top_s+2)
830827bd09bSSatish Balay 	    {;}
831827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
832827bd09bSSatish Balay 	  else
833827bd09bSSatish Balay 	    {
834827bd09bSSatish Balay 	      ar = *(--top_a);
835827bd09bSSatish Balay 	      size = *(--top_s);
836827bd09bSSatish Balay 	    }
837827bd09bSSatish Balay 	}
838827bd09bSSatish Balay 
839827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
840827bd09bSSatish Balay       else
841827bd09bSSatish Balay 	{
842827bd09bSSatish Balay 	  /* insertion sort for bottom */
843827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
844827bd09bSSatish Balay             {
845827bd09bSSatish Balay               temp = *pj;
846827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
847827bd09bSSatish Balay                 {
848827bd09bSSatish Balay                   if (*pi <= temp) break;
849827bd09bSSatish Balay                   *(pi+1)=*pi;
850827bd09bSSatish Balay                 }
851827bd09bSSatish Balay               *(pi+1)=temp;
852827bd09bSSatish Balay 	    }
853827bd09bSSatish Balay 
854827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
855*3fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
856827bd09bSSatish Balay 
857827bd09bSSatish Balay 	  /* else pop another list from the stack */
858827bd09bSSatish Balay 	  ar = *(--top_a);
859827bd09bSSatish Balay 	  size = *(--top_s);
860827bd09bSSatish Balay 	}
861827bd09bSSatish Balay     }
862*3fdc5746SBarry Smith   PetscFunctionReturn(0);
863827bd09bSSatish Balay }
864827bd09bSSatish Balay 
865827bd09bSSatish Balay 
866827bd09bSSatish Balay 
867827bd09bSSatish Balay /******************************************************************************
868827bd09bSSatish Balay Function: ivec_sort_companion().
869827bd09bSSatish Balay 
870827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
871827bd09bSSatish Balay Output: sorted list (in ascending order).
872827bd09bSSatish Balay Return: none.
873827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
874827bd09bSSatish Balay ******************************************************************************/
875*3fdc5746SBarry Smith PetscErrorCode
876a501084fSBarry Smith ivec_sort_companion( int *ar,  int *ar2,  int size)
877827bd09bSSatish Balay {
878a501084fSBarry Smith    int *pi, *pj, temp, temp2;
879a501084fSBarry Smith    int **top_a = (int **)offset_stack;
880a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
881a501084fSBarry Smith    int *pi2, *pj2;
882a501084fSBarry Smith    int mid;
883827bd09bSSatish Balay 
884*3fdc5746SBarry Smith   PetscFunctionBegin;
885827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
886827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
887827bd09bSSatish Balay   size--;
888827bd09bSSatish Balay 
889827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
890827bd09bSSatish Balay   for (;;)
891827bd09bSSatish Balay     {
892827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
893827bd09bSSatish Balay       if (size > SORT_OPT)
894827bd09bSSatish Balay 	{
895827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
896827bd09bSSatish Balay 	  mid = size>>1;
897827bd09bSSatish Balay 	  pi = ar+1;
898827bd09bSSatish Balay 	  pj = ar+mid;
899827bd09bSSatish Balay 	  pi2 = ar2+1;
900827bd09bSSatish Balay 	  pj2 = ar2+mid;
901827bd09bSSatish Balay 
902827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
903827bd09bSSatish Balay 	  SWAP(*pi,*pj)
904827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
905827bd09bSSatish Balay 
906827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
907827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
908827bd09bSSatish Balay 	  pj = ar+size;
909827bd09bSSatish Balay 	  pj2 = ar2+size;
910827bd09bSSatish Balay 	  if (*pi > *pj)
911827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
912827bd09bSSatish Balay 	  if (*ar > *pj)
913827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
914827bd09bSSatish Balay 	  else if (*pi > *ar)
915827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
916827bd09bSSatish Balay 
917827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
918827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
919827bd09bSSatish Balay 	  for(;;)
920827bd09bSSatish Balay 	    {
921827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
922827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
923827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
924827bd09bSSatish Balay 
925827bd09bSSatish Balay 	      /* if we've crossed we're done */
926827bd09bSSatish Balay 	      if (pj<pi) break;
927827bd09bSSatish Balay 
928827bd09bSSatish Balay 	      /* else swap */
929827bd09bSSatish Balay 	      SWAP(*pi,*pj)
930827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
931827bd09bSSatish Balay 	    }
932827bd09bSSatish Balay 
933827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
934827bd09bSSatish Balay 	  SWAP(*ar,*pj)
935827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
936827bd09bSSatish Balay 
937827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
938827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
939827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");}
940827bd09bSSatish Balay 
941827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
942827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
943827bd09bSSatish Balay 	    {
944827bd09bSSatish Balay 	      *(top_a++) = pi;
945827bd09bSSatish Balay 	      *(top_a++) = pi2;
946827bd09bSSatish Balay 	      size -= *top_s+2;
947827bd09bSSatish Balay 	      top_s++;
948827bd09bSSatish Balay 	    }
949827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
950827bd09bSSatish Balay 	  else if (size -= *top_s+2)
951827bd09bSSatish Balay 	    {;}
952827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
953827bd09bSSatish Balay 	  else
954827bd09bSSatish Balay 	    {
955827bd09bSSatish Balay 	      ar2 = *(--top_a);
956827bd09bSSatish Balay 	      ar  = *(--top_a);
957827bd09bSSatish Balay 	      size = *(--top_s);
958827bd09bSSatish Balay 	    }
959827bd09bSSatish Balay 	}
960827bd09bSSatish Balay 
961827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
962827bd09bSSatish Balay       else
963827bd09bSSatish Balay 	{
964827bd09bSSatish Balay 	  /* insertion sort for bottom */
965827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
966827bd09bSSatish Balay             {
967827bd09bSSatish Balay               temp = *pj;
968827bd09bSSatish Balay               temp2 = *pj2;
969827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
970827bd09bSSatish Balay                 {
971827bd09bSSatish Balay                   if (*pi <= temp) break;
972827bd09bSSatish Balay                   *(pi+1)=*pi;
973827bd09bSSatish Balay                   *(pi2+1)=*pi2;
974827bd09bSSatish Balay                 }
975827bd09bSSatish Balay               *(pi+1)=temp;
976827bd09bSSatish Balay               *(pi2+1)=temp2;
977827bd09bSSatish Balay 	    }
978827bd09bSSatish Balay 
979827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
980*3fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
981827bd09bSSatish Balay 
982827bd09bSSatish Balay 	  /* else pop another list from the stack */
983827bd09bSSatish Balay 	  ar2 = *(--top_a);
984827bd09bSSatish Balay 	  ar  = *(--top_a);
985827bd09bSSatish Balay 	  size = *(--top_s);
986827bd09bSSatish Balay 	}
987827bd09bSSatish Balay     }
988*3fdc5746SBarry Smith   PetscFunctionReturn(0);
989827bd09bSSatish Balay }
990827bd09bSSatish Balay 
991827bd09bSSatish Balay 
992827bd09bSSatish Balay 
993827bd09bSSatish Balay /******************************************************************************
994827bd09bSSatish Balay Function: ivec_sort_companion_hack().
995827bd09bSSatish Balay 
996827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
997827bd09bSSatish Balay Output: sorted list (in ascending order).
998827bd09bSSatish Balay Return: none.
999827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1000827bd09bSSatish Balay ******************************************************************************/
1001*3fdc5746SBarry Smith PetscErrorCode
1002a501084fSBarry Smith ivec_sort_companion_hack( int *ar,  int **ar2,
1003a501084fSBarry Smith 			  int size)
1004827bd09bSSatish Balay {
1005a501084fSBarry Smith    int *pi, *pj, temp, *ptr;
1006a501084fSBarry Smith    int **top_a = (int **)offset_stack;
1007a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
1008a501084fSBarry Smith    int **pi2, **pj2;
1009a501084fSBarry Smith    int mid;
1010827bd09bSSatish Balay 
1011*3fdc5746SBarry Smith   PetscFunctionBegin;
1012827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1013827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1014827bd09bSSatish Balay   size--;
1015827bd09bSSatish Balay 
1016827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1017827bd09bSSatish Balay   for (;;)
1018827bd09bSSatish Balay     {
1019827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1020827bd09bSSatish Balay       if (size > SORT_OPT)
1021827bd09bSSatish Balay 	{
1022827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1023827bd09bSSatish Balay 	  mid = size>>1;
1024827bd09bSSatish Balay 	  pi = ar+1;
1025827bd09bSSatish Balay 	  pj = ar+mid;
1026827bd09bSSatish Balay 	  pi2 = ar2+1;
1027827bd09bSSatish Balay 	  pj2 = ar2+mid;
1028827bd09bSSatish Balay 
1029827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1030827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1031827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1032827bd09bSSatish Balay 
1033827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1034827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1035827bd09bSSatish Balay 	  pj = ar+size;
1036827bd09bSSatish Balay 	  pj2 = ar2+size;
1037827bd09bSSatish Balay 	  if (*pi > *pj)
1038827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1039827bd09bSSatish Balay 	  if (*ar > *pj)
1040827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1041827bd09bSSatish Balay 	  else if (*pi > *ar)
1042827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1043827bd09bSSatish Balay 
1044827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1045827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1046827bd09bSSatish Balay 	  for(;;)
1047827bd09bSSatish Balay 	    {
1048827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1049827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1050827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1051827bd09bSSatish Balay 
1052827bd09bSSatish Balay 	      /* if we've crossed we're done */
1053827bd09bSSatish Balay 	      if (pj<pi) break;
1054827bd09bSSatish Balay 
1055827bd09bSSatish Balay 	      /* else swap */
1056827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1057827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1058827bd09bSSatish Balay 	    }
1059827bd09bSSatish Balay 
1060827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1061827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1062827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1063827bd09bSSatish Balay 
1064827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1065827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1066827bd09bSSatish Balay          {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");}
1067827bd09bSSatish Balay 
1068827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1069827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
1070827bd09bSSatish Balay 	    {
1071827bd09bSSatish Balay 	      *(top_a++) = pi;
1072827bd09bSSatish Balay 	      *(top_a++) = (int*) pi2;
1073827bd09bSSatish Balay 	      size -= *top_s+2;
1074827bd09bSSatish Balay 	      top_s++;
1075827bd09bSSatish Balay 	    }
1076827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1077827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1078827bd09bSSatish Balay 	    {;}
1079827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1080827bd09bSSatish Balay 	  else
1081827bd09bSSatish Balay 	    {
1082827bd09bSSatish Balay 	      ar2 = (int **) *(--top_a);
1083827bd09bSSatish Balay 	      ar  = *(--top_a);
1084827bd09bSSatish Balay 	      size = *(--top_s);
1085827bd09bSSatish Balay 	    }
1086827bd09bSSatish Balay 	}
1087827bd09bSSatish Balay 
1088827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1089827bd09bSSatish Balay       else
1090827bd09bSSatish Balay 	{
1091827bd09bSSatish Balay 	  /* insertion sort for bottom */
1092827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1093827bd09bSSatish Balay             {
1094827bd09bSSatish Balay               temp = *pj;
1095827bd09bSSatish Balay               ptr = *pj2;
1096827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1097827bd09bSSatish Balay                 {
1098827bd09bSSatish Balay                   if (*pi <= temp) break;
1099827bd09bSSatish Balay                   *(pi+1)=*pi;
1100827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1101827bd09bSSatish Balay                 }
1102827bd09bSSatish Balay               *(pi+1)=temp;
1103827bd09bSSatish Balay               *(pi2+1)=ptr;
1104827bd09bSSatish Balay 	    }
1105827bd09bSSatish Balay 
1106827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1107*3fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1108827bd09bSSatish Balay 
1109827bd09bSSatish Balay 	  /* else pop another list from the stack */
1110827bd09bSSatish Balay 	  ar2 = (int **)*(--top_a);
1111827bd09bSSatish Balay 	  ar  = *(--top_a);
1112827bd09bSSatish Balay 	  size = *(--top_s);
1113827bd09bSSatish Balay 	}
1114827bd09bSSatish Balay     }
1115*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1116827bd09bSSatish Balay }
1117827bd09bSSatish Balay 
1118827bd09bSSatish Balay 
1119827bd09bSSatish Balay 
1120827bd09bSSatish Balay /******************************************************************************
1121827bd09bSSatish Balay Function: SMI_sort().
1122827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1123827bd09bSSatish Balay Output: sorted list (in ascending order).
1124827bd09bSSatish Balay Return: none.
1125827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1126827bd09bSSatish Balay ******************************************************************************/
1127*3fdc5746SBarry Smith PetscErrorCode
1128827bd09bSSatish Balay SMI_sort(void *ar1, void *ar2, int size, int type)
1129827bd09bSSatish Balay {
1130*3fdc5746SBarry Smith   PetscFunctionBegin;
1131827bd09bSSatish Balay   if (type == SORT_INTEGER)
1132827bd09bSSatish Balay     {
1133827bd09bSSatish Balay       if (ar2)
1134827bd09bSSatish Balay 	{ivec_sort_companion((int*)ar1,(int*)ar2,size);}
1135827bd09bSSatish Balay       else
1136827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1137827bd09bSSatish Balay     }
1138827bd09bSSatish Balay   else if (type == SORT_INT_PTR)
1139827bd09bSSatish Balay     {
1140827bd09bSSatish Balay       if (ar2)
1141827bd09bSSatish Balay 	{ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);}
1142827bd09bSSatish Balay       else
1143827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1144827bd09bSSatish Balay     }
1145827bd09bSSatish Balay 
1146827bd09bSSatish Balay   else
1147827bd09bSSatish Balay     {
1148827bd09bSSatish Balay       error_msg_fatal("SMI_sort only does SORT_INTEGER!");
1149827bd09bSSatish Balay     }
1150*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1151827bd09bSSatish Balay }
1152827bd09bSSatish Balay 
1153827bd09bSSatish Balay 
1154827bd09bSSatish Balay 
1155827bd09bSSatish Balay /**********************************ivec.c**************************************
1156827bd09bSSatish Balay Function ivec_linear_search()
1157827bd09bSSatish Balay 
1158827bd09bSSatish Balay Input :
1159827bd09bSSatish Balay Output:
1160827bd09bSSatish Balay Return:
1161827bd09bSSatish Balay Description:
1162827bd09bSSatish Balay ***********************************ivec.c*************************************/
1163827bd09bSSatish Balay int
1164a501084fSBarry Smith ivec_linear_search( int item,  int *list,  int n)
1165827bd09bSSatish Balay {
1166a501084fSBarry Smith    int tmp = n-1;
1167*3fdc5746SBarry Smith   PetscFunctionBegin;
1168827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
1169827bd09bSSatish Balay   return(-1);
1170827bd09bSSatish Balay }
1171827bd09bSSatish Balay 
1172827bd09bSSatish Balay 
1173827bd09bSSatish Balay 
1174827bd09bSSatish Balay /**********************************ivec.c**************************************
1175827bd09bSSatish Balay Function ivec_binary_search()
1176827bd09bSSatish Balay 
1177827bd09bSSatish Balay Input :
1178827bd09bSSatish Balay Output:
1179827bd09bSSatish Balay Return:
1180827bd09bSSatish Balay Description:
1181827bd09bSSatish Balay ***********************************ivec.c*************************************/
1182827bd09bSSatish Balay int
1183a501084fSBarry Smith ivec_binary_search( int item,  int *list,  int rh)
1184827bd09bSSatish Balay {
1185a501084fSBarry Smith    int mid, lh=0;
1186827bd09bSSatish Balay 
1187827bd09bSSatish Balay   rh--;
1188827bd09bSSatish Balay   while (lh<=rh)
1189827bd09bSSatish Balay     {
1190827bd09bSSatish Balay       mid = (lh+rh)>>1;
1191827bd09bSSatish Balay       if (*(list+mid) == item)
1192827bd09bSSatish Balay 	{return(mid);}
1193827bd09bSSatish Balay       if (*(list+mid) > item)
1194827bd09bSSatish Balay 	{rh = mid-1;}
1195827bd09bSSatish Balay       else
1196827bd09bSSatish Balay 	{lh = mid+1;}
1197827bd09bSSatish Balay     }
1198827bd09bSSatish Balay   return(-1);
1199827bd09bSSatish Balay }
1200827bd09bSSatish Balay 
1201827bd09bSSatish Balay 
1202827bd09bSSatish Balay 
1203827bd09bSSatish Balay /**********************************ivec.c**************************************
1204827bd09bSSatish Balay Function rvec_dump
1205827bd09bSSatish Balay 
1206827bd09bSSatish Balay Input :
1207827bd09bSSatish Balay Output:
1208827bd09bSSatish Balay Return:
1209827bd09bSSatish Balay Description:
1210827bd09bSSatish Balay ***********************************ivec.c*************************************/
1211*3fdc5746SBarry Smith PetscErrorCode
1212a501084fSBarry Smith rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s)
1213827bd09bSSatish Balay {
1214827bd09bSSatish Balay   int i;
1215*3fdc5746SBarry Smith   PetscFunctionBegin;
1216827bd09bSSatish Balay   printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id);
1217827bd09bSSatish Balay   for (i=0;i<n;i++)
1218827bd09bSSatish Balay     {printf("%f ",v[i]);}
1219827bd09bSSatish Balay   printf("\n");
1220827bd09bSSatish Balay   fflush(stdout);
1221*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1222827bd09bSSatish Balay }
1223827bd09bSSatish Balay 
1224827bd09bSSatish Balay 
1225827bd09bSSatish Balay 
1226827bd09bSSatish Balay /**********************************ivec.c**************************************
1227827bd09bSSatish Balay Function rvec_lb_ub()
1228827bd09bSSatish Balay 
1229827bd09bSSatish Balay Input :
1230827bd09bSSatish Balay Output:
1231827bd09bSSatish Balay Return:
1232827bd09bSSatish Balay Description:
1233827bd09bSSatish Balay ***********************************ivec.c*************************************/
1234*3fdc5746SBarry Smith PetscErrorCode
1235a501084fSBarry Smith rvec_lb_ub( PetscScalar *arg1,  int n, PetscScalar *lb, PetscScalar *ub)
1236827bd09bSSatish Balay {
1237a501084fSBarry Smith    PetscScalar min =  REAL_MAX;
1238a501084fSBarry Smith    PetscScalar max = -REAL_MAX;
1239827bd09bSSatish Balay 
1240*3fdc5746SBarry Smith   PetscFunctionBegin;
1241827bd09bSSatish Balay   while (n--)
1242827bd09bSSatish Balay     {
124339945688SSatish Balay      min = PetscMin(min,*arg1);
124439945688SSatish Balay      max = PetscMax(max,*arg1);
1245827bd09bSSatish Balay      arg1++;
1246827bd09bSSatish Balay     }
1247827bd09bSSatish Balay 
1248827bd09bSSatish Balay   *lb=min;
1249827bd09bSSatish Balay   *ub=max;
1250*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1251827bd09bSSatish Balay }
1252827bd09bSSatish Balay 
1253827bd09bSSatish Balay 
1254827bd09bSSatish Balay 
1255827bd09bSSatish Balay /********************************ivec.c**************************************
1256827bd09bSSatish Balay Function rvec_copy()
1257827bd09bSSatish Balay 
1258827bd09bSSatish Balay Input :
1259827bd09bSSatish Balay Output:
1260827bd09bSSatish Balay Return:
1261827bd09bSSatish Balay Description:
1262827bd09bSSatish Balay *********************************ivec.c*************************************/
1263*3fdc5746SBarry Smith PetscErrorCode
1264a501084fSBarry Smith rvec_copy( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1265827bd09bSSatish Balay {
1266*3fdc5746SBarry Smith   PetscFunctionBegin;
1267827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
1268*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1269827bd09bSSatish Balay }
1270827bd09bSSatish Balay 
1271827bd09bSSatish Balay 
1272827bd09bSSatish Balay 
1273827bd09bSSatish Balay /********************************ivec.c**************************************
1274827bd09bSSatish Balay Function rvec_zero()
1275827bd09bSSatish Balay 
1276827bd09bSSatish Balay Input :
1277827bd09bSSatish Balay Output:
1278827bd09bSSatish Balay Return:
1279827bd09bSSatish Balay Description:
1280827bd09bSSatish Balay *********************************ivec.c*************************************/
1281*3fdc5746SBarry Smith PetscErrorCode
1282a501084fSBarry Smith rvec_zero( PetscScalar *arg1,  int n)
1283827bd09bSSatish Balay {
1284*3fdc5746SBarry Smith   PetscFunctionBegin;
1285827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
1286*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1287827bd09bSSatish Balay }
1288827bd09bSSatish Balay 
1289827bd09bSSatish Balay 
1290827bd09bSSatish Balay 
1291827bd09bSSatish Balay /**********************************ivec.c**************************************
1292827bd09bSSatish Balay Function rvec_one()
1293827bd09bSSatish Balay 
1294827bd09bSSatish Balay Input :
1295827bd09bSSatish Balay Output:
1296827bd09bSSatish Balay Return:
1297827bd09bSSatish Balay Description:
1298827bd09bSSatish Balay ***********************************ivec.c*************************************/
1299*3fdc5746SBarry Smith PetscErrorCode
1300a501084fSBarry Smith rvec_one( PetscScalar *arg1,  int n)
1301827bd09bSSatish Balay {
1302*3fdc5746SBarry Smith   PetscFunctionBegin;
1303827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
1304*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1305827bd09bSSatish Balay }
1306827bd09bSSatish Balay 
1307827bd09bSSatish Balay 
1308827bd09bSSatish Balay 
1309827bd09bSSatish Balay /**********************************ivec.c**************************************
1310827bd09bSSatish Balay Function rvec_neg_one()
1311827bd09bSSatish Balay 
1312827bd09bSSatish Balay Input :
1313827bd09bSSatish Balay Output:
1314827bd09bSSatish Balay Return:
1315827bd09bSSatish Balay Description:
1316827bd09bSSatish Balay ***********************************ivec.c*************************************/
1317*3fdc5746SBarry Smith PetscErrorCode
1318a501084fSBarry Smith rvec_neg_one( PetscScalar *arg1,  int n)
1319827bd09bSSatish Balay {
1320*3fdc5746SBarry Smith   PetscFunctionBegin;
1321827bd09bSSatish Balay   while (n--)  {*arg1++ = -1.0;}
1322*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1323827bd09bSSatish Balay }
1324827bd09bSSatish Balay 
1325827bd09bSSatish Balay 
1326827bd09bSSatish Balay 
1327827bd09bSSatish Balay /**********************************ivec.c**************************************
1328827bd09bSSatish Balay Function rvec_set()
1329827bd09bSSatish Balay 
1330827bd09bSSatish Balay Input :
1331827bd09bSSatish Balay Output:
1332827bd09bSSatish Balay Return:
1333827bd09bSSatish Balay Description:
1334827bd09bSSatish Balay ***********************************ivec.c*************************************/
1335*3fdc5746SBarry Smith PetscErrorCode
1336a501084fSBarry Smith rvec_set( PetscScalar *arg1,  PetscScalar arg2,  int n)
1337827bd09bSSatish Balay {
1338*3fdc5746SBarry Smith   PetscFunctionBegin;
1339827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
1340*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1341827bd09bSSatish Balay }
1342827bd09bSSatish Balay 
1343827bd09bSSatish Balay 
1344827bd09bSSatish Balay 
1345827bd09bSSatish Balay /**********************************ivec.c**************************************
1346827bd09bSSatish Balay Function rvec_scale()
1347827bd09bSSatish Balay 
1348827bd09bSSatish Balay Input :
1349827bd09bSSatish Balay Output:
1350827bd09bSSatish Balay Return:
1351827bd09bSSatish Balay Description:
1352827bd09bSSatish Balay ***********************************ivec.c*************************************/
1353*3fdc5746SBarry Smith PetscErrorCode
1354a501084fSBarry Smith rvec_scale( PetscScalar *arg1,  PetscScalar arg2,  int n)
1355827bd09bSSatish Balay {
1356*3fdc5746SBarry Smith   PetscFunctionBegin;
1357827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
1358*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1359827bd09bSSatish Balay }
1360827bd09bSSatish Balay 
1361827bd09bSSatish Balay 
1362827bd09bSSatish Balay 
1363827bd09bSSatish Balay /********************************ivec.c**************************************
1364827bd09bSSatish Balay Function rvec_add()
1365827bd09bSSatish Balay 
1366827bd09bSSatish Balay Input :
1367827bd09bSSatish Balay Output:
1368827bd09bSSatish Balay Return:
1369827bd09bSSatish Balay Description:
1370827bd09bSSatish Balay *********************************ivec.c*************************************/
1371*3fdc5746SBarry Smith PetscErrorCode
1372a501084fSBarry Smith rvec_add( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1373827bd09bSSatish Balay {
1374*3fdc5746SBarry Smith   PetscFunctionBegin;
1375827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
1376*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1377827bd09bSSatish Balay }
1378827bd09bSSatish Balay 
1379827bd09bSSatish Balay 
1380827bd09bSSatish Balay 
1381827bd09bSSatish Balay /********************************ivec.c**************************************
1382827bd09bSSatish Balay Function rvec_dot()
1383827bd09bSSatish Balay 
1384827bd09bSSatish Balay Input :
1385827bd09bSSatish Balay Output:
1386827bd09bSSatish Balay Return:
1387827bd09bSSatish Balay Description:
1388827bd09bSSatish Balay *********************************ivec.c*************************************/
1389a501084fSBarry Smith PetscScalar
1390a501084fSBarry Smith rvec_dot( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1391827bd09bSSatish Balay {
1392a501084fSBarry Smith   PetscScalar dot=0.0;
1393827bd09bSSatish Balay 
1394827bd09bSSatish Balay   while (n--)  {dot+= *arg1++ * *arg2++;}
1395827bd09bSSatish Balay 
1396827bd09bSSatish Balay   return(dot);
1397827bd09bSSatish Balay }
1398827bd09bSSatish Balay 
1399827bd09bSSatish Balay 
1400827bd09bSSatish Balay 
1401827bd09bSSatish Balay /********************************ivec.c**************************************
1402827bd09bSSatish Balay Function rvec_axpy()
1403827bd09bSSatish Balay 
1404827bd09bSSatish Balay Input :
1405827bd09bSSatish Balay Output:
1406827bd09bSSatish Balay Return:
1407827bd09bSSatish Balay Description:
1408827bd09bSSatish Balay *********************************ivec.c*************************************/
1409*3fdc5746SBarry Smith PetscErrorCode
1410a501084fSBarry Smith rvec_axpy( PetscScalar *arg1,  PetscScalar *arg2,  PetscScalar scale,
1411a501084fSBarry Smith 	   int n)
1412827bd09bSSatish Balay {
1413*3fdc5746SBarry Smith   PetscFunctionBegin;
1414827bd09bSSatish Balay   while (n--)  {*arg1++ += scale * *arg2++;}
1415*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1416827bd09bSSatish Balay }
1417827bd09bSSatish Balay 
1418827bd09bSSatish Balay 
1419827bd09bSSatish Balay /********************************ivec.c**************************************
1420827bd09bSSatish Balay Function rvec_mult()
1421827bd09bSSatish Balay 
1422827bd09bSSatish Balay Input :
1423827bd09bSSatish Balay Output:
1424827bd09bSSatish Balay Return:
1425827bd09bSSatish Balay Description:
1426827bd09bSSatish Balay *********************************ivec.c*************************************/
1427*3fdc5746SBarry Smith PetscErrorCode
1428a501084fSBarry Smith rvec_mult( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1429827bd09bSSatish Balay {
1430*3fdc5746SBarry Smith   PetscFunctionBegin;
1431827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
1432*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1433827bd09bSSatish Balay }
1434827bd09bSSatish Balay 
1435827bd09bSSatish Balay 
1436827bd09bSSatish Balay 
1437827bd09bSSatish Balay /********************************ivec.c**************************************
1438827bd09bSSatish Balay Function rvec_max()
1439827bd09bSSatish Balay 
1440827bd09bSSatish Balay Input :
1441827bd09bSSatish Balay Output:
1442827bd09bSSatish Balay Return:
1443827bd09bSSatish Balay Description:
1444827bd09bSSatish Balay *********************************ivec.c*************************************/
1445*3fdc5746SBarry Smith PetscErrorCode
1446a501084fSBarry Smith rvec_max( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1447827bd09bSSatish Balay {
1448*3fdc5746SBarry Smith   PetscFunctionBegin;
144939945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
1450*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1451827bd09bSSatish Balay }
1452827bd09bSSatish Balay 
1453827bd09bSSatish Balay 
1454827bd09bSSatish Balay 
1455827bd09bSSatish Balay /********************************ivec.c**************************************
1456827bd09bSSatish Balay Function rvec_max_abs()
1457827bd09bSSatish Balay 
1458827bd09bSSatish Balay Input :
1459827bd09bSSatish Balay Output:
1460827bd09bSSatish Balay Return:
1461827bd09bSSatish Balay Description:
1462827bd09bSSatish Balay *********************************ivec.c*************************************/
1463*3fdc5746SBarry Smith PetscErrorCode
1464a501084fSBarry Smith rvec_max_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1465827bd09bSSatish Balay {
1466*3fdc5746SBarry Smith   PetscFunctionBegin;
1467827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
1468*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1469827bd09bSSatish Balay }
1470827bd09bSSatish Balay 
1471827bd09bSSatish Balay 
1472827bd09bSSatish Balay 
1473827bd09bSSatish Balay /********************************ivec.c**************************************
1474827bd09bSSatish Balay Function rvec_min()
1475827bd09bSSatish Balay 
1476827bd09bSSatish Balay Input :
1477827bd09bSSatish Balay Output:
1478827bd09bSSatish Balay Return:
1479827bd09bSSatish Balay Description:
1480827bd09bSSatish Balay *********************************ivec.c*************************************/
1481*3fdc5746SBarry Smith PetscErrorCode
1482a501084fSBarry Smith rvec_min( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1483827bd09bSSatish Balay {
1484*3fdc5746SBarry Smith   PetscFunctionBegin;
148539945688SSatish Balay   while (n--)  {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;}
1486*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1487827bd09bSSatish Balay }
1488827bd09bSSatish Balay 
1489827bd09bSSatish Balay 
1490827bd09bSSatish Balay 
1491827bd09bSSatish Balay /********************************ivec.c**************************************
1492827bd09bSSatish Balay Function rvec_min_abs()
1493827bd09bSSatish Balay 
1494827bd09bSSatish Balay Input :
1495827bd09bSSatish Balay Output:
1496827bd09bSSatish Balay Return:
1497827bd09bSSatish Balay Description:
1498827bd09bSSatish Balay *********************************ivec.c*************************************/
1499*3fdc5746SBarry Smith PetscErrorCode
1500a501084fSBarry Smith rvec_min_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1501827bd09bSSatish Balay {
1502*3fdc5746SBarry Smith   PetscFunctionBegin;
1503827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
1504*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1505827bd09bSSatish Balay }
1506827bd09bSSatish Balay 
1507827bd09bSSatish Balay 
1508827bd09bSSatish Balay 
1509827bd09bSSatish Balay /********************************ivec.c**************************************
1510827bd09bSSatish Balay Function rvec_exists()
1511827bd09bSSatish Balay 
1512827bd09bSSatish Balay Input :
1513827bd09bSSatish Balay Output:
1514827bd09bSSatish Balay Return:
1515827bd09bSSatish Balay Description:
1516827bd09bSSatish Balay *********************************ivec.c*************************************/
1517*3fdc5746SBarry Smith PetscErrorCode
1518a501084fSBarry Smith rvec_exists( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1519827bd09bSSatish Balay {
1520*3fdc5746SBarry Smith   PetscFunctionBegin;
1521827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
1522*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1523827bd09bSSatish Balay }
1524827bd09bSSatish Balay 
1525827bd09bSSatish Balay 
1526827bd09bSSatish Balay 
1527827bd09bSSatish Balay /**********************************ivec.c**************************************
1528827bd09bSSatish Balay Function rvec_non_uniform()
1529827bd09bSSatish Balay 
1530827bd09bSSatish Balay Input :
1531827bd09bSSatish Balay Output:
1532827bd09bSSatish Balay Return:
1533827bd09bSSatish Balay Description:
1534827bd09bSSatish Balay ***********************************ivec.c*************************************/
1535*3fdc5746SBarry Smith PetscErrorCode
1536a501084fSBarry Smith rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  int n,  int *arg3)
1537827bd09bSSatish Balay {
1538a501084fSBarry Smith    int i, j, type;
1539827bd09bSSatish Balay 
1540*3fdc5746SBarry Smith   PetscFunctionBegin;
1541827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
1542827bd09bSSatish Balay   for (i=0;i<n;)
1543827bd09bSSatish Balay     {
1544827bd09bSSatish Balay       /* clump 'em for now */
1545827bd09bSSatish Balay       j=i+1;
1546827bd09bSSatish Balay       type = arg3[i];
1547827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
1548827bd09bSSatish Balay 	{j++;}
1549827bd09bSSatish Balay 
1550827bd09bSSatish Balay       /* how many together */
1551827bd09bSSatish Balay       j -= i;
1552827bd09bSSatish Balay 
1553827bd09bSSatish Balay       /* call appropriate ivec function */
1554827bd09bSSatish Balay       if (type == GL_MAX)
1555827bd09bSSatish Balay 	{rvec_max(arg1,arg2,j);}
1556827bd09bSSatish Balay       else if (type == GL_MIN)
1557827bd09bSSatish Balay 	{rvec_min(arg1,arg2,j);}
1558827bd09bSSatish Balay       else if (type == GL_MULT)
1559827bd09bSSatish Balay 	{rvec_mult(arg1,arg2,j);}
1560827bd09bSSatish Balay       else if (type == GL_ADD)
1561827bd09bSSatish Balay 	{rvec_add(arg1,arg2,j);}
1562827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
1563827bd09bSSatish Balay 	{rvec_max_abs(arg1,arg2,j);}
1564827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
1565827bd09bSSatish Balay 	{rvec_min_abs(arg1,arg2,j);}
1566827bd09bSSatish Balay       else if (type == GL_EXISTS)
1567827bd09bSSatish Balay 	{rvec_exists(arg1,arg2,j);}
1568827bd09bSSatish Balay       else
1569827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");}
1570827bd09bSSatish Balay 
1571827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
1572827bd09bSSatish Balay     }
1573*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1574827bd09bSSatish Balay }
1575827bd09bSSatish Balay 
1576827bd09bSSatish Balay 
1577827bd09bSSatish Balay 
1578827bd09bSSatish Balay /**********************************ivec.c**************************************
1579827bd09bSSatish Balay Function rvec_fct_addr()
1580827bd09bSSatish Balay 
1581827bd09bSSatish Balay Input :
1582827bd09bSSatish Balay Output:
1583827bd09bSSatish Balay Return:
1584827bd09bSSatish Balay Description:
1585827bd09bSSatish Balay ***********************************ivec.c*************************************/
1586a501084fSBarry Smith vfp rvec_fct_addr( int type)
1587827bd09bSSatish Balay {
1588827bd09bSSatish Balay   if (type == NON_UNIFORM)
1589*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);}
1590827bd09bSSatish Balay   else if (type == GL_MAX)
1591*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);}
1592827bd09bSSatish Balay   else if (type == GL_MIN)
1593*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);}
1594827bd09bSSatish Balay   else if (type == GL_MULT)
1595*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);}
1596827bd09bSSatish Balay   else if (type == GL_ADD)
1597*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);}
1598827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
1599*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);}
1600827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
1601*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);}
1602827bd09bSSatish Balay   else if (type == GL_EXISTS)
1603*3fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);}
1604827bd09bSSatish Balay 
1605827bd09bSSatish Balay   /* catch all ... not good if we get here */
1606827bd09bSSatish Balay   return(NULL);
1607827bd09bSSatish Balay }
1608827bd09bSSatish Balay 
1609827bd09bSSatish Balay 
1610827bd09bSSatish Balay /******************************************************************************
1611827bd09bSSatish Balay Function: my_sort().
1612827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1613827bd09bSSatish Balay Output: sorted list (in ascending order).
1614827bd09bSSatish Balay Return: none.
1615827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1616827bd09bSSatish Balay ******************************************************************************/
1617*3fdc5746SBarry Smith PetscErrorCode
1618a501084fSBarry Smith rvec_sort( PetscScalar *ar,  int Size)
1619827bd09bSSatish Balay {
1620a501084fSBarry Smith    PetscScalar *pi, *pj, temp;
1621a501084fSBarry Smith    PetscScalar **top_a = (PetscScalar **)offset_stack;
1622a501084fSBarry Smith    long *top_s = psize_stack, *bottom_s = psize_stack;
1623a501084fSBarry Smith    long size = (long) Size;
1624827bd09bSSatish Balay 
1625*3fdc5746SBarry Smith   PetscFunctionBegin;
1626827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1627827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1628827bd09bSSatish Balay   size--;
1629827bd09bSSatish Balay 
1630827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1631827bd09bSSatish Balay   for (;;)
1632827bd09bSSatish Balay     {
1633827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1634827bd09bSSatish Balay       if (size > SORT_OPT)
1635827bd09bSSatish Balay 	{
1636827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1637827bd09bSSatish Balay 	  pi = ar+1;
1638827bd09bSSatish Balay 	  pj = ar+size;
1639827bd09bSSatish Balay 
1640827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1641827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
1642827bd09bSSatish Balay 
1643827bd09bSSatish Balay 	  pj = ar+size;
1644827bd09bSSatish Balay 
1645827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1646827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1647827bd09bSSatish Balay 	  if (*pi > *pj)
1648827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
1649827bd09bSSatish Balay 	  if (*ar > *pj)
1650827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
1651827bd09bSSatish Balay 	  else if (*pi > *ar)
1652827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
1653827bd09bSSatish Balay 
1654827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1655827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1656827bd09bSSatish Balay 	  for(;;)
1657827bd09bSSatish Balay 	    {
1658827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1659827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
1660827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
1661827bd09bSSatish Balay 
1662827bd09bSSatish Balay 	      /* if we've crossed we're done */
1663827bd09bSSatish Balay 	      if (pj<pi) break;
1664827bd09bSSatish Balay 
1665827bd09bSSatish Balay 	      /* else swap */
1666827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1667827bd09bSSatish Balay 	    }
1668827bd09bSSatish Balay 
1669827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1670827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1671827bd09bSSatish Balay 
1672827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1673827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1674827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1675827bd09bSSatish Balay 
1676827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1677827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1678827bd09bSSatish Balay 	    {
1679827bd09bSSatish Balay 	      *(top_a++) = pi;
1680827bd09bSSatish Balay 	      size -= *top_s+2;
1681827bd09bSSatish Balay 	      top_s++;
1682827bd09bSSatish Balay 	    }
1683827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1684827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1685827bd09bSSatish Balay 	    {;}
1686827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1687827bd09bSSatish Balay 	  else
1688827bd09bSSatish Balay 	    {
1689827bd09bSSatish Balay 	      ar = *(--top_a);
1690827bd09bSSatish Balay 	      size = *(--top_s);
1691827bd09bSSatish Balay 	    }
1692827bd09bSSatish Balay 	}
1693827bd09bSSatish Balay 
1694827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1695827bd09bSSatish Balay       else
1696827bd09bSSatish Balay 	{
1697827bd09bSSatish Balay 	  /* insertion sort for bottom */
1698827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
1699827bd09bSSatish Balay             {
1700827bd09bSSatish Balay               temp = *pj;
1701827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
1702827bd09bSSatish Balay                 {
1703827bd09bSSatish Balay                   if (*pi <= temp) break;
1704827bd09bSSatish Balay                   *(pi+1)=*pi;
1705827bd09bSSatish Balay                 }
1706827bd09bSSatish Balay               *(pi+1)=temp;
1707827bd09bSSatish Balay 	    }
1708827bd09bSSatish Balay 
1709827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1710*3fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1711827bd09bSSatish Balay 
1712827bd09bSSatish Balay 	  /* else pop another list from the stack */
1713827bd09bSSatish Balay 	  ar = *(--top_a);
1714827bd09bSSatish Balay 	  size = *(--top_s);
1715827bd09bSSatish Balay 	}
1716827bd09bSSatish Balay     }
1717*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1718827bd09bSSatish Balay }
1719827bd09bSSatish Balay 
1720827bd09bSSatish Balay 
1721827bd09bSSatish Balay 
1722827bd09bSSatish Balay /******************************************************************************
1723827bd09bSSatish Balay Function: my_sort().
1724827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1725827bd09bSSatish Balay Output: sorted list (in ascending order).
1726827bd09bSSatish Balay Return: none.
1727827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1728827bd09bSSatish Balay ******************************************************************************/
1729*3fdc5746SBarry Smith PetscErrorCode
1730a501084fSBarry Smith rvec_sort_companion( PetscScalar *ar,  int *ar2,  int Size)
1731827bd09bSSatish Balay {
1732a501084fSBarry Smith    PetscScalar *pi, *pj, temp;
1733a501084fSBarry Smith    PetscScalar **top_a = (PetscScalar **)offset_stack;
1734a501084fSBarry Smith    long *top_s = psize_stack, *bottom_s = psize_stack;
1735a501084fSBarry Smith    long size = (long) Size;
1736827bd09bSSatish Balay 
1737a501084fSBarry Smith    int *pi2, *pj2;
1738a501084fSBarry Smith    int ptr;
1739a501084fSBarry Smith    long mid;
1740827bd09bSSatish Balay 
1741*3fdc5746SBarry Smith   PetscFunctionBegin;
1742827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1743827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1744827bd09bSSatish Balay   size--;
1745827bd09bSSatish Balay 
1746827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1747827bd09bSSatish Balay   for (;;)
1748827bd09bSSatish Balay     {
1749827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1750827bd09bSSatish Balay       if (size > SORT_OPT)
1751827bd09bSSatish Balay 	{
1752827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1753827bd09bSSatish Balay 	  mid = size>>1;
1754827bd09bSSatish Balay 	  pi = ar+1;
1755827bd09bSSatish Balay 	  pj = ar+mid;
1756827bd09bSSatish Balay 	  pi2 = ar2+1;
1757827bd09bSSatish Balay 	  pj2 = ar2+mid;
1758827bd09bSSatish Balay 
1759827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1760827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1761827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1762827bd09bSSatish Balay 
1763827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1764827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1765827bd09bSSatish Balay 	  pj = ar+size;
1766827bd09bSSatish Balay 	  pj2 = ar2+size;
1767827bd09bSSatish Balay 	  if (*pi > *pj)
1768827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1769827bd09bSSatish Balay 	  if (*ar > *pj)
1770827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1771827bd09bSSatish Balay 	  else if (*pi > *ar)
1772827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1773827bd09bSSatish Balay 
1774827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1775827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1776827bd09bSSatish Balay 	  for(;;)
1777827bd09bSSatish Balay 	    {
1778827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1779827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1780827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1781827bd09bSSatish Balay 
1782827bd09bSSatish Balay 	      /* if we've crossed we're done */
1783827bd09bSSatish Balay 	      if (pj<pi) break;
1784827bd09bSSatish Balay 
1785827bd09bSSatish Balay 	      /* else swap */
1786827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1787827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1788827bd09bSSatish Balay 	    }
1789827bd09bSSatish Balay 
1790827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1791827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1792827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1793827bd09bSSatish Balay 
1794827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1795827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1796827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1797827bd09bSSatish Balay 
1798827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1799827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1800827bd09bSSatish Balay 	    {
1801827bd09bSSatish Balay 	      *(top_a++) = pi;
1802a501084fSBarry Smith 	      *(top_a++) = (PetscScalar *) pi2;
1803827bd09bSSatish Balay 	      size -= *top_s+2;
1804827bd09bSSatish Balay 	      top_s++;
1805827bd09bSSatish Balay 	    }
1806827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1807827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1808827bd09bSSatish Balay 	    {;}
1809827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1810827bd09bSSatish Balay 	  else
1811827bd09bSSatish Balay 	    {
1812827bd09bSSatish Balay 	      ar2 = (int*) *(--top_a);
1813827bd09bSSatish Balay 	      ar  = *(--top_a);
1814827bd09bSSatish Balay 	      size = *(--top_s);
1815827bd09bSSatish Balay 	    }
1816827bd09bSSatish Balay 	}
1817827bd09bSSatish Balay 
1818827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1819827bd09bSSatish Balay       else
1820827bd09bSSatish Balay 	{
1821827bd09bSSatish Balay 	  /* insertion sort for bottom */
1822827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1823827bd09bSSatish Balay             {
1824827bd09bSSatish Balay               temp = *pj;
1825827bd09bSSatish Balay               ptr = *pj2;
1826827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1827827bd09bSSatish Balay                 {
1828827bd09bSSatish Balay                   if (*pi <= temp) break;
1829827bd09bSSatish Balay                   *(pi+1)=*pi;
1830827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1831827bd09bSSatish Balay                 }
1832827bd09bSSatish Balay               *(pi+1)=temp;
1833827bd09bSSatish Balay               *(pi2+1)=ptr;
1834827bd09bSSatish Balay 	    }
1835827bd09bSSatish Balay 
1836827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
1837*3fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1838827bd09bSSatish Balay 
1839827bd09bSSatish Balay 	  /* else pop another list from the stack */
1840827bd09bSSatish Balay 	  ar2 = (int*) *(--top_a);
1841827bd09bSSatish Balay 	  ar  = *(--top_a);
1842827bd09bSSatish Balay 	  size = *(--top_s);
1843827bd09bSSatish Balay 	}
1844827bd09bSSatish Balay     }
1845*3fdc5746SBarry Smith   PetscFunctionReturn(0);
1846827bd09bSSatish Balay }
1847827bd09bSSatish Balay 
1848827bd09bSSatish Balay 
1849827bd09bSSatish Balay 
1850827bd09bSSatish Balay 
1851827bd09bSSatish Balay 
1852827bd09bSSatish Balay /**********************************ivec.c**************************************
1853827bd09bSSatish Balay Function ivec_binary_search()
1854827bd09bSSatish Balay 
1855827bd09bSSatish Balay Input :
1856827bd09bSSatish Balay Output:
1857827bd09bSSatish Balay Return:
1858827bd09bSSatish Balay Description:
1859827bd09bSSatish Balay ***********************************ivec.c*************************************/
1860827bd09bSSatish Balay int
1861a501084fSBarry Smith rvec_binary_search( PetscScalar item,  PetscScalar *list,  int rh)
1862827bd09bSSatish Balay {
1863a501084fSBarry Smith   int mid, lh=0;
1864*3fdc5746SBarry Smith   PetscFunctionBegin;
1865827bd09bSSatish Balay   rh--;
1866827bd09bSSatish Balay   while (lh<=rh)
1867827bd09bSSatish Balay     {
1868827bd09bSSatish Balay       mid = (lh+rh)>>1;
1869827bd09bSSatish Balay       if (*(list+mid) == item)
1870827bd09bSSatish Balay 	{return(mid);}
1871827bd09bSSatish Balay       if (*(list+mid) > item)
1872827bd09bSSatish Balay 	{rh = mid-1;}
1873827bd09bSSatish Balay       else
1874827bd09bSSatish Balay 	{lh = mid+1;}
1875827bd09bSSatish Balay     }
1876827bd09bSSatish Balay   return(-1);
1877827bd09bSSatish Balay }
1878827bd09bSSatish Balay 
1879827bd09bSSatish Balay 
1880827bd09bSSatish Balay 
1881827bd09bSSatish Balay 
1882827bd09bSSatish Balay 
1883