xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 0924e98c97c437ba98313834470257b43063364e)
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*0924e98cSBarry Smith PetscErrorCode ivec_dump(int *v, int n, int tag, int tag2, char * s)
46827bd09bSSatish Balay {
47827bd09bSSatish Balay   int i;
483fdc5746SBarry Smith   PetscFunctionBegin;
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);
543fdc5746SBarry Smith   PetscFunctionReturn(0);
55827bd09bSSatish Balay }
56827bd09bSSatish Balay 
57827bd09bSSatish Balay 
58827bd09bSSatish Balay 
59827bd09bSSatish Balay /**********************************ivec.c**************************************
60827bd09bSSatish Balay Function ivec_lb_ub()
61827bd09bSSatish Balay 
62827bd09bSSatish Balay Input :
63827bd09bSSatish Balay Output:
64827bd09bSSatish Balay Return:
65827bd09bSSatish Balay Description:
66827bd09bSSatish Balay ***********************************ivec.c*************************************/
67*0924e98cSBarry Smith PetscErrorCode 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 
723fdc5746SBarry Smith   PetscFunctionBegin;
73827bd09bSSatish Balay   while (n--)
74827bd09bSSatish Balay     {
7539945688SSatish Balay      min = PetscMin(min,*arg1);
7639945688SSatish Balay      max = PetscMax(max,*arg1);
77827bd09bSSatish Balay      arg1++;
78827bd09bSSatish Balay     }
79827bd09bSSatish Balay 
80827bd09bSSatish Balay   *lb=min;
81827bd09bSSatish Balay   *ub=max;
823fdc5746SBarry Smith   PetscFunctionReturn(0);
83827bd09bSSatish Balay }
84827bd09bSSatish Balay 
85827bd09bSSatish Balay 
86827bd09bSSatish Balay 
87827bd09bSSatish Balay /**********************************ivec.c**************************************
88827bd09bSSatish Balay Function ivec_copy()
89827bd09bSSatish Balay 
90827bd09bSSatish Balay Input :
91827bd09bSSatish Balay Output:
92827bd09bSSatish Balay Return:
93827bd09bSSatish Balay Description:
94827bd09bSSatish Balay ***********************************ivec.c*************************************/
95a501084fSBarry Smith int *ivec_copy( int *arg1,  int *arg2,  int n)
96827bd09bSSatish Balay {
97827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
98827bd09bSSatish Balay   return(arg1);
99827bd09bSSatish Balay }
100827bd09bSSatish Balay 
101827bd09bSSatish Balay 
102827bd09bSSatish Balay 
103827bd09bSSatish Balay /**********************************ivec.c**************************************
104827bd09bSSatish Balay Function ivec_zero()
105827bd09bSSatish Balay 
106827bd09bSSatish Balay Input :
107827bd09bSSatish Balay Output:
108827bd09bSSatish Balay Return:
109827bd09bSSatish Balay Description:
110827bd09bSSatish Balay ***********************************ivec.c*************************************/
111*0924e98cSBarry Smith PetscErrorCode ivec_zero( int *arg1,  int n)
112827bd09bSSatish Balay {
1133fdc5746SBarry Smith   PetscFunctionBegin;
114827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
1153fdc5746SBarry Smith   PetscFunctionReturn(0);
116827bd09bSSatish Balay }
117827bd09bSSatish Balay 
118827bd09bSSatish Balay 
119827bd09bSSatish Balay 
120827bd09bSSatish Balay /**********************************ivec.c**************************************
121827bd09bSSatish Balay Function ivec_comp()
122827bd09bSSatish Balay 
123827bd09bSSatish Balay Input :
124827bd09bSSatish Balay Output:
125827bd09bSSatish Balay Return:
126827bd09bSSatish Balay Description:
127827bd09bSSatish Balay ***********************************ivec.c*************************************/
128*0924e98cSBarry Smith PetscErrorCode ivec_comp( int *arg1,  int n)
129827bd09bSSatish Balay {
1303fdc5746SBarry Smith   PetscFunctionBegin;
131827bd09bSSatish Balay   while (n--)  {*arg1 = ~*arg1; arg1++;}
1323fdc5746SBarry Smith   PetscFunctionReturn(0);
133827bd09bSSatish Balay }
134827bd09bSSatish Balay 
135827bd09bSSatish Balay 
136827bd09bSSatish Balay 
137827bd09bSSatish Balay /**********************************ivec.c**************************************
138827bd09bSSatish Balay Function ivec_neg_one()
139827bd09bSSatish Balay 
140827bd09bSSatish Balay Input :
141827bd09bSSatish Balay Output:
142827bd09bSSatish Balay Return:
143827bd09bSSatish Balay Description:
144827bd09bSSatish Balay ***********************************ivec.c*************************************/
145*0924e98cSBarry Smith PetscErrorCode ivec_neg_one( int *arg1,  int n)
146827bd09bSSatish Balay {
1473fdc5746SBarry Smith   PetscFunctionBegin;
148827bd09bSSatish Balay   while (n--)  {*arg1++ = -1;}
1493fdc5746SBarry Smith   PetscFunctionReturn(0);
150827bd09bSSatish Balay }
151827bd09bSSatish Balay 
152827bd09bSSatish Balay 
153827bd09bSSatish Balay 
154827bd09bSSatish Balay /**********************************ivec.c**************************************
155827bd09bSSatish Balay Function ivec_pos_one()
156827bd09bSSatish Balay 
157827bd09bSSatish Balay Input :
158827bd09bSSatish Balay Output:
159827bd09bSSatish Balay Return:
160827bd09bSSatish Balay Description:
161827bd09bSSatish Balay ***********************************ivec.c*************************************/
162*0924e98cSBarry Smith PetscErrorCode ivec_pos_one( int *arg1,  int n)
163827bd09bSSatish Balay {
1643fdc5746SBarry Smith   PetscFunctionBegin;
165827bd09bSSatish Balay   while (n--)  {*arg1++ = 1;}
1663fdc5746SBarry Smith   PetscFunctionReturn(0);
167827bd09bSSatish Balay }
168827bd09bSSatish Balay 
169827bd09bSSatish Balay 
170827bd09bSSatish Balay 
171827bd09bSSatish Balay /**********************************ivec.c**************************************
172827bd09bSSatish Balay Function ivec_c_index()
173827bd09bSSatish Balay 
174827bd09bSSatish Balay Input :
175827bd09bSSatish Balay Output:
176827bd09bSSatish Balay Return:
177827bd09bSSatish Balay Description:
178827bd09bSSatish Balay ***********************************ivec.c*************************************/
179*0924e98cSBarry Smith PetscErrorCode ivec_c_index( int *arg1,  int n)
180827bd09bSSatish Balay {
181a501084fSBarry Smith    int i=0;
182827bd09bSSatish Balay 
1833fdc5746SBarry Smith   PetscFunctionBegin;
184827bd09bSSatish Balay   while (n--)  {*arg1++ = i++;}
1853fdc5746SBarry Smith   PetscFunctionReturn(0);
186827bd09bSSatish Balay }
187827bd09bSSatish Balay 
188827bd09bSSatish Balay 
189827bd09bSSatish Balay 
190827bd09bSSatish Balay /**********************************ivec.c**************************************
191827bd09bSSatish Balay Function ivec_fortran_index()
192827bd09bSSatish Balay 
193827bd09bSSatish Balay Input :
194827bd09bSSatish Balay Output:
195827bd09bSSatish Balay Return:
196827bd09bSSatish Balay Description:
197827bd09bSSatish Balay ***********************************ivec.c*************************************/
198*0924e98cSBarry Smith PetscErrorCode ivec_fortran_index( int *arg1,  int n)
199827bd09bSSatish Balay {
200a501084fSBarry Smith    int i=0;
201827bd09bSSatish Balay 
2023fdc5746SBarry Smith   PetscFunctionBegin;
203827bd09bSSatish Balay   while (n--)  {*arg1++ = ++i;}
2043fdc5746SBarry Smith   PetscFunctionReturn(0);
205827bd09bSSatish Balay }
206827bd09bSSatish Balay 
207827bd09bSSatish Balay 
208827bd09bSSatish Balay 
209827bd09bSSatish Balay /**********************************ivec.c**************************************
210827bd09bSSatish Balay Function ivec_set()
211827bd09bSSatish Balay 
212827bd09bSSatish Balay Input :
213827bd09bSSatish Balay Output:
214827bd09bSSatish Balay Return:
215827bd09bSSatish Balay Description:
216827bd09bSSatish Balay ***********************************ivec.c*************************************/
217*0924e98cSBarry Smith PetscErrorCode ivec_set( int *arg1,  int arg2,  int n)
218827bd09bSSatish Balay {
2193fdc5746SBarry Smith   PetscFunctionBegin;
220827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
2213fdc5746SBarry Smith   PetscFunctionReturn(0);
222827bd09bSSatish Balay }
223827bd09bSSatish Balay 
224827bd09bSSatish Balay 
225827bd09bSSatish Balay 
226827bd09bSSatish Balay /**********************************ivec.c**************************************
227827bd09bSSatish Balay Function ivec_cmp()
228827bd09bSSatish Balay 
229827bd09bSSatish Balay Input :
230827bd09bSSatish Balay Output:
231827bd09bSSatish Balay Return:
232827bd09bSSatish Balay Description:
233827bd09bSSatish Balay ***********************************ivec.c*************************************/
234827bd09bSSatish Balay int
235a501084fSBarry Smith ivec_cmp( int *arg1,  int *arg2,  int n)
236827bd09bSSatish Balay {
2373fdc5746SBarry Smith   PetscFunctionBegin;
238827bd09bSSatish Balay   while (n--)  {if (*arg1++ != *arg2++)  {return(FALSE);}}
239827bd09bSSatish Balay   return(TRUE);
240827bd09bSSatish Balay }
241827bd09bSSatish Balay 
242827bd09bSSatish Balay 
243827bd09bSSatish Balay 
244827bd09bSSatish Balay /**********************************ivec.c**************************************
245827bd09bSSatish Balay Function ivec_max()
246827bd09bSSatish Balay 
247827bd09bSSatish Balay Input :
248827bd09bSSatish Balay Output:
249827bd09bSSatish Balay Return:
250827bd09bSSatish Balay Description:
251827bd09bSSatish Balay ***********************************ivec.c*************************************/
252*0924e98cSBarry Smith PetscErrorCode ivec_max( int *arg1,  int *arg2,  int n)
253827bd09bSSatish Balay {
2543fdc5746SBarry Smith   PetscFunctionBegin;
25539945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
2563fdc5746SBarry Smith   PetscFunctionReturn(0);
257827bd09bSSatish Balay }
258827bd09bSSatish Balay 
259827bd09bSSatish Balay 
260827bd09bSSatish Balay 
261827bd09bSSatish Balay /**********************************ivec.c**************************************
262827bd09bSSatish Balay Function ivec_min()
263827bd09bSSatish Balay 
264827bd09bSSatish Balay Input :
265827bd09bSSatish Balay Output:
266827bd09bSSatish Balay Return:
267827bd09bSSatish Balay Description:
268827bd09bSSatish Balay ***********************************ivec.c*************************************/
269*0924e98cSBarry Smith PetscErrorCode ivec_min( int *arg1,  int *arg2,  int n)
270827bd09bSSatish Balay {
2713fdc5746SBarry Smith   PetscFunctionBegin;
27239945688SSatish Balay   while (n--)  {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;}
2733fdc5746SBarry Smith   PetscFunctionReturn(0);
274827bd09bSSatish Balay }
275827bd09bSSatish Balay 
276827bd09bSSatish Balay 
277827bd09bSSatish Balay 
278827bd09bSSatish Balay /**********************************ivec.c**************************************
279827bd09bSSatish Balay Function ivec_mult()
280827bd09bSSatish Balay 
281827bd09bSSatish Balay Input :
282827bd09bSSatish Balay Output:
283827bd09bSSatish Balay Return:
284827bd09bSSatish Balay Description:
285827bd09bSSatish Balay ***********************************ivec.c*************************************/
286*0924e98cSBarry Smith PetscErrorCode ivec_mult( int *arg1,  int *arg2,  int n)
287827bd09bSSatish Balay {
2883fdc5746SBarry Smith   PetscFunctionBegin;
289827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
2903fdc5746SBarry Smith   PetscFunctionReturn(0);
291827bd09bSSatish Balay }
292827bd09bSSatish Balay 
293827bd09bSSatish Balay 
294827bd09bSSatish Balay 
295827bd09bSSatish Balay /**********************************ivec.c**************************************
296827bd09bSSatish Balay Function ivec_add()
297827bd09bSSatish Balay 
298827bd09bSSatish Balay Input :
299827bd09bSSatish Balay Output:
300827bd09bSSatish Balay Return:
301827bd09bSSatish Balay Description:
302827bd09bSSatish Balay ***********************************ivec.c*************************************/
303*0924e98cSBarry Smith PetscErrorCode ivec_add( int *arg1,  int *arg2,  int n)
304827bd09bSSatish Balay {
3053fdc5746SBarry Smith   PetscFunctionBegin;
306827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
3073fdc5746SBarry Smith   PetscFunctionReturn(0);
308827bd09bSSatish Balay }
309827bd09bSSatish Balay 
310827bd09bSSatish Balay 
311827bd09bSSatish Balay 
312827bd09bSSatish Balay /**********************************ivec.c**************************************
313827bd09bSSatish Balay Function ivec_lxor()
314827bd09bSSatish Balay 
315827bd09bSSatish Balay Input :
316827bd09bSSatish Balay Output:
317827bd09bSSatish Balay Return:
318827bd09bSSatish Balay Description:
319827bd09bSSatish Balay ***********************************ivec.c*************************************/
320*0924e98cSBarry Smith PetscErrorCode ivec_lxor( int *arg1,  int *arg2,  int n)
321827bd09bSSatish Balay {
3223fdc5746SBarry Smith   PetscFunctionBegin;
323827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
3243fdc5746SBarry Smith   PetscFunctionReturn(0);
325827bd09bSSatish Balay }
326827bd09bSSatish Balay 
327827bd09bSSatish Balay 
328827bd09bSSatish Balay 
329827bd09bSSatish Balay /**********************************ivec.c**************************************
330827bd09bSSatish Balay Function ivec_xor()
331827bd09bSSatish Balay 
332827bd09bSSatish Balay Input :
333827bd09bSSatish Balay Output:
334827bd09bSSatish Balay Return:
335827bd09bSSatish Balay Description:
336827bd09bSSatish Balay ***********************************ivec.c*************************************/
337*0924e98cSBarry Smith PetscErrorCode ivec_xor( int *arg1,  int *arg2,  int n)
338827bd09bSSatish Balay {
3393fdc5746SBarry Smith   PetscFunctionBegin;
340827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
3413fdc5746SBarry Smith   PetscFunctionReturn(0);
342827bd09bSSatish Balay }
343827bd09bSSatish Balay 
344827bd09bSSatish Balay 
345827bd09bSSatish Balay 
346827bd09bSSatish Balay /**********************************ivec.c**************************************
347827bd09bSSatish Balay Function ivec_or()
348827bd09bSSatish Balay 
349827bd09bSSatish Balay Input :
350827bd09bSSatish Balay Output:
351827bd09bSSatish Balay Return:
352827bd09bSSatish Balay Description:
353827bd09bSSatish Balay ***********************************ivec.c*************************************/
354*0924e98cSBarry Smith PetscErrorCode ivec_or( int *arg1,  int *arg2,  int n)
355827bd09bSSatish Balay {
3563fdc5746SBarry Smith   PetscFunctionBegin;
357827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
3583fdc5746SBarry Smith   PetscFunctionReturn(0);
359827bd09bSSatish Balay }
360827bd09bSSatish Balay 
361827bd09bSSatish Balay 
362827bd09bSSatish Balay 
363827bd09bSSatish Balay /**********************************ivec.c**************************************
364827bd09bSSatish Balay Function ivec_lor()
365827bd09bSSatish Balay 
366827bd09bSSatish Balay Input :
367827bd09bSSatish Balay Output:
368827bd09bSSatish Balay Return:
369827bd09bSSatish Balay Description:
370827bd09bSSatish Balay ***********************************ivec.c*************************************/
371*0924e98cSBarry Smith PetscErrorCode ivec_lor( int *arg1,  int *arg2,  int n)
372827bd09bSSatish Balay {
3733fdc5746SBarry Smith   PetscFunctionBegin;
374827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
3753fdc5746SBarry Smith   PetscFunctionReturn(0);
376827bd09bSSatish Balay }
377827bd09bSSatish Balay 
378827bd09bSSatish Balay 
379827bd09bSSatish Balay 
380827bd09bSSatish Balay /**********************************ivec.c**************************************
381827bd09bSSatish Balay Function ivec_or3()
382827bd09bSSatish Balay 
383827bd09bSSatish Balay Input :
384827bd09bSSatish Balay Output:
385827bd09bSSatish Balay Return:
386827bd09bSSatish Balay Description:
387827bd09bSSatish Balay ***********************************ivec.c*************************************/
388*0924e98cSBarry Smith PetscErrorCode ivec_or3( int *arg1,  int *arg2,  int *arg3,
389a501084fSBarry Smith 	  int n)
390827bd09bSSatish Balay {
3913fdc5746SBarry Smith   PetscFunctionBegin;
392827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ | *arg3++);}
3933fdc5746SBarry Smith   PetscFunctionReturn(0);
394827bd09bSSatish Balay }
395827bd09bSSatish Balay 
396827bd09bSSatish Balay 
397827bd09bSSatish Balay 
398827bd09bSSatish Balay /**********************************ivec.c**************************************
399827bd09bSSatish Balay Function ivec_and()
400827bd09bSSatish Balay 
401827bd09bSSatish Balay Input :
402827bd09bSSatish Balay Output:
403827bd09bSSatish Balay Return:
404827bd09bSSatish Balay Description:
405827bd09bSSatish Balay ***********************************ivec.c*************************************/
406*0924e98cSBarry Smith PetscErrorCode ivec_and( int *arg1,  int *arg2,  int n)
407827bd09bSSatish Balay {
4083fdc5746SBarry Smith   PetscFunctionBegin;
409827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
4103fdc5746SBarry Smith   PetscFunctionReturn(0);
411827bd09bSSatish Balay }
412827bd09bSSatish Balay 
413827bd09bSSatish Balay 
414827bd09bSSatish Balay 
415827bd09bSSatish Balay /**********************************ivec.c**************************************
416827bd09bSSatish Balay Function ivec_land()
417827bd09bSSatish Balay 
418827bd09bSSatish Balay Input :
419827bd09bSSatish Balay Output:
420827bd09bSSatish Balay Return:
421827bd09bSSatish Balay Description:
422827bd09bSSatish Balay ***********************************ivec.c*************************************/
423*0924e98cSBarry Smith PetscErrorCode ivec_land( int *arg1,  int *arg2,  int n)
424827bd09bSSatish Balay {
4253fdc5746SBarry Smith   PetscFunctionBegin;
426827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
4273fdc5746SBarry Smith   PetscFunctionReturn(0);
428827bd09bSSatish Balay }
429827bd09bSSatish Balay 
430827bd09bSSatish Balay 
431827bd09bSSatish Balay 
432827bd09bSSatish Balay /**********************************ivec.c**************************************
433827bd09bSSatish Balay Function ivec_and3()
434827bd09bSSatish Balay 
435827bd09bSSatish Balay Input :
436827bd09bSSatish Balay Output:
437827bd09bSSatish Balay Return:
438827bd09bSSatish Balay Description:
439827bd09bSSatish Balay ***********************************ivec.c*************************************/
440*0924e98cSBarry Smith PetscErrorCode ivec_and3( int *arg1,  int *arg2,  int *arg3, int n)
441827bd09bSSatish Balay {
4423fdc5746SBarry Smith   PetscFunctionBegin;
443827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
4443fdc5746SBarry Smith   PetscFunctionReturn(0);
445827bd09bSSatish Balay }
446827bd09bSSatish Balay 
447827bd09bSSatish Balay 
448827bd09bSSatish Balay 
449827bd09bSSatish Balay /**********************************ivec.c**************************************
450827bd09bSSatish Balay Function ivec_sum
451827bd09bSSatish Balay 
452827bd09bSSatish Balay Input :
453827bd09bSSatish Balay Output:
454827bd09bSSatish Balay Return:
455827bd09bSSatish Balay Description:
456827bd09bSSatish Balay ***********************************ivec.c*************************************/
457a501084fSBarry Smith int ivec_sum( int *arg1,  int n)
458827bd09bSSatish Balay {
459a501084fSBarry Smith    int tmp = 0;
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_and
470827bd09bSSatish Balay 
471827bd09bSSatish Balay Input :
472827bd09bSSatish Balay Output:
473827bd09bSSatish Balay Return:
474827bd09bSSatish Balay Description:
475827bd09bSSatish Balay ***********************************ivec.c*************************************/
476a501084fSBarry Smith int ivec_reduce_and( int *arg1,  int n)
477827bd09bSSatish Balay {
478a501084fSBarry Smith    int tmp = ALL_ONES;
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_reduce_or
489827bd09bSSatish Balay 
490827bd09bSSatish Balay Input :
491827bd09bSSatish Balay Output:
492827bd09bSSatish Balay Return:
493827bd09bSSatish Balay Description:
494827bd09bSSatish Balay ***********************************ivec.c*************************************/
495a501084fSBarry Smith int ivec_reduce_or( int *arg1,  int n)
496827bd09bSSatish Balay {
497a501084fSBarry Smith    int tmp = 0;
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_prod
508827bd09bSSatish Balay 
509827bd09bSSatish Balay Input :
510827bd09bSSatish Balay Output:
511827bd09bSSatish Balay Return:
512827bd09bSSatish Balay Description:
513827bd09bSSatish Balay ***********************************ivec.c*************************************/
514a501084fSBarry Smith int ivec_prod( int *arg1,  int n)
515827bd09bSSatish Balay {
516a501084fSBarry Smith    int tmp = 1;
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_u_sum
527827bd09bSSatish Balay 
528827bd09bSSatish Balay Input :
529827bd09bSSatish Balay Output:
530827bd09bSSatish Balay Return:
531827bd09bSSatish Balay Description:
532827bd09bSSatish Balay ***********************************ivec.c*************************************/
533a501084fSBarry Smith int ivec_u_sum( unsigned *arg1,  int n)
534827bd09bSSatish Balay {
535a501084fSBarry Smith    unsigned tmp = 0;
536827bd09bSSatish Balay 
537827bd09bSSatish Balay 
538827bd09bSSatish Balay   while (n--)  {tmp += *arg1++;}
539827bd09bSSatish Balay   return(tmp);
540827bd09bSSatish Balay }
541827bd09bSSatish Balay 
542827bd09bSSatish Balay 
543827bd09bSSatish Balay 
544827bd09bSSatish Balay /**********************************ivec.c**************************************
545827bd09bSSatish Balay Function ivec_lb()
546827bd09bSSatish Balay 
547827bd09bSSatish Balay Input :
548827bd09bSSatish Balay Output:
549827bd09bSSatish Balay Return:
550827bd09bSSatish Balay Description:
551827bd09bSSatish Balay ***********************************ivec.c*************************************/
552827bd09bSSatish Balay int
553a501084fSBarry Smith ivec_lb( int *arg1,  int n)
554827bd09bSSatish Balay {
555a501084fSBarry Smith    int min = INT_MAX;
556827bd09bSSatish Balay 
557827bd09bSSatish Balay 
55839945688SSatish Balay   while (n--)  {min = PetscMin(min,*arg1); arg1++;}
559827bd09bSSatish Balay   return(min);
560827bd09bSSatish Balay }
561827bd09bSSatish Balay 
562827bd09bSSatish Balay 
563827bd09bSSatish Balay 
564827bd09bSSatish Balay /**********************************ivec.c**************************************
565827bd09bSSatish Balay Function ivec_ub()
566827bd09bSSatish Balay 
567827bd09bSSatish Balay Input :
568827bd09bSSatish Balay Output:
569827bd09bSSatish Balay Return:
570827bd09bSSatish Balay Description:
571827bd09bSSatish Balay ***********************************ivec.c*************************************/
572827bd09bSSatish Balay int
573a501084fSBarry Smith ivec_ub( int *arg1,  int n)
574827bd09bSSatish Balay {
575a501084fSBarry Smith    int max = INT_MIN;
576827bd09bSSatish Balay 
577827bd09bSSatish Balay 
57839945688SSatish Balay   while (n--)  {max = PetscMax(max,*arg1); arg1++;}
579827bd09bSSatish Balay   return(max);
580827bd09bSSatish Balay }
581827bd09bSSatish Balay 
582827bd09bSSatish Balay 
583827bd09bSSatish Balay 
584827bd09bSSatish Balay /**********************************ivec.c**************************************
585827bd09bSSatish Balay Function split_buf()
586827bd09bSSatish Balay 
587827bd09bSSatish Balay Input :
588827bd09bSSatish Balay Output:
589827bd09bSSatish Balay Return:
590827bd09bSSatish Balay Description:
591827bd09bSSatish Balay 
592827bd09bSSatish Balay assumes that sizeof(int) == 4bytes!!!
593827bd09bSSatish Balay ***********************************ivec.c*************************************/
594827bd09bSSatish Balay int
595a501084fSBarry Smith ivec_split_buf(int *buf1, int **buf2,  int size)
596827bd09bSSatish Balay {
597827bd09bSSatish Balay   *buf2 = (buf1 + (size>>3));
598827bd09bSSatish Balay   return(size);
599827bd09bSSatish Balay }
600827bd09bSSatish Balay 
601827bd09bSSatish Balay 
602827bd09bSSatish Balay 
603827bd09bSSatish Balay /**********************************ivec.c**************************************
604827bd09bSSatish Balay Function ivec_non_uniform()
605827bd09bSSatish Balay 
606827bd09bSSatish Balay Input :
607827bd09bSSatish Balay Output:
608827bd09bSSatish Balay Return:
609827bd09bSSatish Balay Description:
610827bd09bSSatish Balay ***********************************ivec.c*************************************/
611*0924e98cSBarry Smith PetscErrorCode ivec_non_uniform(int *arg1, int *arg2,  int n,  int *arg3)
612827bd09bSSatish Balay {
613a501084fSBarry Smith    int i, j, type;
614827bd09bSSatish Balay 
615827bd09bSSatish Balay 
6163fdc5746SBarry Smith   PetscFunctionBegin;
617827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
618827bd09bSSatish Balay   for (i=0;i<n;)
619827bd09bSSatish Balay     {
620827bd09bSSatish Balay       /* clump 'em for now */
621827bd09bSSatish Balay       j=i+1;
622827bd09bSSatish Balay       type = arg3[i];
623827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
624827bd09bSSatish Balay 	{j++;}
625827bd09bSSatish Balay 
626827bd09bSSatish Balay       /* how many together */
627827bd09bSSatish Balay       j -= i;
628827bd09bSSatish Balay 
629827bd09bSSatish Balay       /* call appropriate ivec function */
630827bd09bSSatish Balay       if (type == GL_MAX)
631827bd09bSSatish Balay 	{ivec_max(arg1,arg2,j);}
632827bd09bSSatish Balay       else if (type == GL_MIN)
633827bd09bSSatish Balay 	{ivec_min(arg1,arg2,j);}
634827bd09bSSatish Balay       else if (type == GL_MULT)
635827bd09bSSatish Balay 	{ivec_mult(arg1,arg2,j);}
636827bd09bSSatish Balay       else if (type == GL_ADD)
637827bd09bSSatish Balay 	{ivec_add(arg1,arg2,j);}
638827bd09bSSatish Balay       else if (type == GL_B_XOR)
639827bd09bSSatish Balay 	{ivec_xor(arg1,arg2,j);}
640827bd09bSSatish Balay       else if (type == GL_B_OR)
641827bd09bSSatish Balay 	{ivec_or(arg1,arg2,j);}
642827bd09bSSatish Balay       else if (type == GL_B_AND)
643827bd09bSSatish Balay 	{ivec_and(arg1,arg2,j);}
644827bd09bSSatish Balay       else if (type == GL_L_XOR)
645827bd09bSSatish Balay 	{ivec_lxor(arg1,arg2,j);}
646827bd09bSSatish Balay       else if (type == GL_L_OR)
647827bd09bSSatish Balay 	{ivec_lor(arg1,arg2,j);}
648827bd09bSSatish Balay       else if (type == GL_L_AND)
649827bd09bSSatish Balay 	{ivec_land(arg1,arg2,j);}
650827bd09bSSatish Balay       else
651827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");}
652827bd09bSSatish Balay 
653827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
654827bd09bSSatish Balay     }
6553fdc5746SBarry Smith   PetscFunctionReturn(0);
656827bd09bSSatish Balay }
657827bd09bSSatish Balay 
658827bd09bSSatish Balay 
659827bd09bSSatish Balay 
660827bd09bSSatish Balay /**********************************ivec.c**************************************
661827bd09bSSatish Balay Function ivec_addr()
662827bd09bSSatish Balay 
663827bd09bSSatish Balay Input :
664827bd09bSSatish Balay Output:
665827bd09bSSatish Balay Return:
666827bd09bSSatish Balay Description:
667827bd09bSSatish Balay ***********************************ivec.c*************************************/
668a501084fSBarry Smith vfp ivec_fct_addr( int type)
669827bd09bSSatish Balay {
6703fdc5746SBarry Smith   PetscFunctionBegin;
671827bd09bSSatish Balay   if (type == NON_UNIFORM)
6723fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);}
673827bd09bSSatish Balay   else if (type == GL_MAX)
6743fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);}
675827bd09bSSatish Balay   else if (type == GL_MIN)
6763fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);}
677827bd09bSSatish Balay   else if (type == GL_MULT)
6783fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);}
679827bd09bSSatish Balay   else if (type == GL_ADD)
6803fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);}
681827bd09bSSatish Balay   else if (type == GL_B_XOR)
6823fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);}
683827bd09bSSatish Balay   else if (type == GL_B_OR)
6843fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);}
685827bd09bSSatish Balay   else if (type == GL_B_AND)
6863fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);}
687827bd09bSSatish Balay   else if (type == GL_L_XOR)
6883fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);}
689827bd09bSSatish Balay   else if (type == GL_L_OR)
6903fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);}
691827bd09bSSatish Balay   else if (type == GL_L_AND)
6923fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);}
693827bd09bSSatish Balay 
694827bd09bSSatish Balay   /* catch all ... not good if we get here */
695827bd09bSSatish Balay   return(NULL);
696827bd09bSSatish Balay }
697827bd09bSSatish Balay 
698827bd09bSSatish Balay 
699827bd09bSSatish Balay /**********************************ivec.c**************************************
700827bd09bSSatish Balay Function ct_bits()
701827bd09bSSatish Balay 
702827bd09bSSatish Balay Input :
703827bd09bSSatish Balay Output:
704827bd09bSSatish Balay Return:
705827bd09bSSatish Balay Description: MUST FIX THIS!!!
706827bd09bSSatish Balay ***********************************ivec.c*************************************/
707827bd09bSSatish Balay #if defined(notusing)
708827bd09bSSatish Balay static
709827bd09bSSatish Balay int
710a501084fSBarry Smith ivec_ct_bits( int *ptr,  int n)
711827bd09bSSatish Balay {
712a501084fSBarry Smith    int tmp=0;
713827bd09bSSatish Balay 
714827bd09bSSatish Balay 
715827bd09bSSatish Balay   /* should expand to full 32 bit */
716827bd09bSSatish Balay   while (n--)
717827bd09bSSatish Balay     {
718827bd09bSSatish Balay       if (*ptr&128) {tmp++;}
719827bd09bSSatish Balay       if (*ptr&64)  {tmp++;}
720827bd09bSSatish Balay       if (*ptr&32)  {tmp++;}
721827bd09bSSatish Balay       if (*ptr&16)  {tmp++;}
722827bd09bSSatish Balay       if (*ptr&8)   {tmp++;}
723827bd09bSSatish Balay       if (*ptr&4)   {tmp++;}
724827bd09bSSatish Balay       if (*ptr&2)   {tmp++;}
725827bd09bSSatish Balay       if (*ptr&1)   {tmp++;}
726827bd09bSSatish Balay       ptr++;
727827bd09bSSatish Balay     }
728827bd09bSSatish Balay 
729827bd09bSSatish Balay   return(tmp);
730827bd09bSSatish Balay }
731827bd09bSSatish Balay #endif
732827bd09bSSatish Balay 
733827bd09bSSatish Balay 
734827bd09bSSatish Balay /******************************************************************************
735827bd09bSSatish Balay Function: ivec_sort().
736827bd09bSSatish Balay 
737827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
738827bd09bSSatish Balay Output: sorted list (in ascending order).
739827bd09bSSatish Balay Return: none.
740827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
741827bd09bSSatish Balay ******************************************************************************/
742*0924e98cSBarry Smith PetscErrorCode ivec_sort( int *ar,  int size)
743827bd09bSSatish Balay {
744a501084fSBarry Smith    int *pi, *pj, temp;
745a501084fSBarry Smith    int **top_a = (int **) offset_stack;
746a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
747827bd09bSSatish Balay 
748827bd09bSSatish Balay 
749827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
750827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
751827bd09bSSatish Balay   size--;
752827bd09bSSatish Balay 
753827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
754827bd09bSSatish Balay   for (;;)
755827bd09bSSatish Balay     {
756827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
757827bd09bSSatish Balay       if (size > SORT_OPT)
758827bd09bSSatish Balay 	{
759827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
760827bd09bSSatish Balay 	  pi = ar+1;
761827bd09bSSatish Balay 	  pj = ar+size;
762827bd09bSSatish Balay 
763827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
764827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
765827bd09bSSatish Balay 
766827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
767827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
768827bd09bSSatish Balay 	  if (*pi > *pj)
769827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
770827bd09bSSatish Balay 	  if (*ar > *pj)
771827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
772827bd09bSSatish Balay 	  else if (*pi > *ar)
773827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
774827bd09bSSatish Balay 
775827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
776827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
777827bd09bSSatish Balay 	  for(;;)
778827bd09bSSatish Balay 	    {
779827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
780827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
781827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
782827bd09bSSatish Balay 
783827bd09bSSatish Balay 	      /* if we've crossed we're done */
784827bd09bSSatish Balay 	      if (pj<pi) break;
785827bd09bSSatish Balay 
786827bd09bSSatish Balay 	      /* else swap */
787827bd09bSSatish Balay 	      SWAP(*pi,*pj)
788827bd09bSSatish Balay 	    }
789827bd09bSSatish Balay 
790827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
791827bd09bSSatish Balay 	  SWAP(*ar,*pj)
792827bd09bSSatish Balay 
793827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
794827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
795827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");}
796827bd09bSSatish Balay 
797827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
798827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
799827bd09bSSatish Balay 	    {
800827bd09bSSatish Balay 	      *(top_a++) = pi;
801827bd09bSSatish Balay 	      size -= *top_s+2;
802827bd09bSSatish Balay 	      top_s++;
803827bd09bSSatish Balay 	    }
804827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
805827bd09bSSatish Balay 	  else if (size -= *top_s+2)
806827bd09bSSatish Balay 	    {;}
807827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
808827bd09bSSatish Balay 	  else
809827bd09bSSatish Balay 	    {
810827bd09bSSatish Balay 	      ar = *(--top_a);
811827bd09bSSatish Balay 	      size = *(--top_s);
812827bd09bSSatish Balay 	    }
813827bd09bSSatish Balay 	}
814827bd09bSSatish Balay 
815827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
816827bd09bSSatish Balay       else
817827bd09bSSatish Balay 	{
818827bd09bSSatish Balay 	  /* insertion sort for bottom */
819827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
820827bd09bSSatish Balay             {
821827bd09bSSatish Balay               temp = *pj;
822827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
823827bd09bSSatish Balay                 {
824827bd09bSSatish Balay                   if (*pi <= temp) break;
825827bd09bSSatish Balay                   *(pi+1)=*pi;
826827bd09bSSatish Balay                 }
827827bd09bSSatish Balay               *(pi+1)=temp;
828827bd09bSSatish Balay 	    }
829827bd09bSSatish Balay 
830827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
8313fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
832827bd09bSSatish Balay 
833827bd09bSSatish Balay 	  /* else pop another list from the stack */
834827bd09bSSatish Balay 	  ar = *(--top_a);
835827bd09bSSatish Balay 	  size = *(--top_s);
836827bd09bSSatish Balay 	}
837827bd09bSSatish Balay     }
8383fdc5746SBarry Smith   PetscFunctionReturn(0);
839827bd09bSSatish Balay }
840827bd09bSSatish Balay 
841827bd09bSSatish Balay 
842827bd09bSSatish Balay 
843827bd09bSSatish Balay /******************************************************************************
844827bd09bSSatish Balay Function: ivec_sort_companion().
845827bd09bSSatish Balay 
846827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
847827bd09bSSatish Balay Output: sorted list (in ascending order).
848827bd09bSSatish Balay Return: none.
849827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
850827bd09bSSatish Balay ******************************************************************************/
851*0924e98cSBarry Smith PetscErrorCode ivec_sort_companion( int *ar,  int *ar2,  int size)
852827bd09bSSatish Balay {
853a501084fSBarry Smith    int *pi, *pj, temp, temp2;
854a501084fSBarry Smith    int **top_a = (int **)offset_stack;
855a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
856a501084fSBarry Smith    int *pi2, *pj2;
857a501084fSBarry Smith    int mid;
858827bd09bSSatish Balay 
8593fdc5746SBarry Smith   PetscFunctionBegin;
860827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
861827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
862827bd09bSSatish Balay   size--;
863827bd09bSSatish Balay 
864827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
865827bd09bSSatish Balay   for (;;)
866827bd09bSSatish Balay     {
867827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
868827bd09bSSatish Balay       if (size > SORT_OPT)
869827bd09bSSatish Balay 	{
870827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
871827bd09bSSatish Balay 	  mid = size>>1;
872827bd09bSSatish Balay 	  pi = ar+1;
873827bd09bSSatish Balay 	  pj = ar+mid;
874827bd09bSSatish Balay 	  pi2 = ar2+1;
875827bd09bSSatish Balay 	  pj2 = ar2+mid;
876827bd09bSSatish Balay 
877827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
878827bd09bSSatish Balay 	  SWAP(*pi,*pj)
879827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
880827bd09bSSatish Balay 
881827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
882827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
883827bd09bSSatish Balay 	  pj = ar+size;
884827bd09bSSatish Balay 	  pj2 = ar2+size;
885827bd09bSSatish Balay 	  if (*pi > *pj)
886827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
887827bd09bSSatish Balay 	  if (*ar > *pj)
888827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
889827bd09bSSatish Balay 	  else if (*pi > *ar)
890827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
891827bd09bSSatish Balay 
892827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
893827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
894827bd09bSSatish Balay 	  for(;;)
895827bd09bSSatish Balay 	    {
896827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
897827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
898827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
899827bd09bSSatish Balay 
900827bd09bSSatish Balay 	      /* if we've crossed we're done */
901827bd09bSSatish Balay 	      if (pj<pi) break;
902827bd09bSSatish Balay 
903827bd09bSSatish Balay 	      /* else swap */
904827bd09bSSatish Balay 	      SWAP(*pi,*pj)
905827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
906827bd09bSSatish Balay 	    }
907827bd09bSSatish Balay 
908827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
909827bd09bSSatish Balay 	  SWAP(*ar,*pj)
910827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
911827bd09bSSatish Balay 
912827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
913827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
914827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");}
915827bd09bSSatish Balay 
916827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
917827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
918827bd09bSSatish Balay 	    {
919827bd09bSSatish Balay 	      *(top_a++) = pi;
920827bd09bSSatish Balay 	      *(top_a++) = pi2;
921827bd09bSSatish Balay 	      size -= *top_s+2;
922827bd09bSSatish Balay 	      top_s++;
923827bd09bSSatish Balay 	    }
924827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
925827bd09bSSatish Balay 	  else if (size -= *top_s+2)
926827bd09bSSatish Balay 	    {;}
927827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
928827bd09bSSatish Balay 	  else
929827bd09bSSatish Balay 	    {
930827bd09bSSatish Balay 	      ar2 = *(--top_a);
931827bd09bSSatish Balay 	      ar  = *(--top_a);
932827bd09bSSatish Balay 	      size = *(--top_s);
933827bd09bSSatish Balay 	    }
934827bd09bSSatish Balay 	}
935827bd09bSSatish Balay 
936827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
937827bd09bSSatish Balay       else
938827bd09bSSatish Balay 	{
939827bd09bSSatish Balay 	  /* insertion sort for bottom */
940827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
941827bd09bSSatish Balay             {
942827bd09bSSatish Balay               temp = *pj;
943827bd09bSSatish Balay               temp2 = *pj2;
944827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
945827bd09bSSatish Balay                 {
946827bd09bSSatish Balay                   if (*pi <= temp) break;
947827bd09bSSatish Balay                   *(pi+1)=*pi;
948827bd09bSSatish Balay                   *(pi2+1)=*pi2;
949827bd09bSSatish Balay                 }
950827bd09bSSatish Balay               *(pi+1)=temp;
951827bd09bSSatish Balay               *(pi2+1)=temp2;
952827bd09bSSatish Balay 	    }
953827bd09bSSatish Balay 
954827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
9553fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
956827bd09bSSatish Balay 
957827bd09bSSatish Balay 	  /* else pop another list from the stack */
958827bd09bSSatish Balay 	  ar2 = *(--top_a);
959827bd09bSSatish Balay 	  ar  = *(--top_a);
960827bd09bSSatish Balay 	  size = *(--top_s);
961827bd09bSSatish Balay 	}
962827bd09bSSatish Balay     }
9633fdc5746SBarry Smith   PetscFunctionReturn(0);
964827bd09bSSatish Balay }
965827bd09bSSatish Balay 
966827bd09bSSatish Balay 
967827bd09bSSatish Balay 
968827bd09bSSatish Balay /******************************************************************************
969827bd09bSSatish Balay Function: ivec_sort_companion_hack().
970827bd09bSSatish Balay 
971827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
972827bd09bSSatish Balay Output: sorted list (in ascending order).
973827bd09bSSatish Balay Return: none.
974827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
975827bd09bSSatish Balay ******************************************************************************/
976*0924e98cSBarry Smith PetscErrorCode ivec_sort_companion_hack( int *ar,  int **ar2,
977a501084fSBarry Smith 			  int size)
978827bd09bSSatish Balay {
979a501084fSBarry Smith    int *pi, *pj, temp, *ptr;
980a501084fSBarry Smith    int **top_a = (int **)offset_stack;
981a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
982a501084fSBarry Smith    int **pi2, **pj2;
983a501084fSBarry Smith    int mid;
984827bd09bSSatish Balay 
9853fdc5746SBarry Smith   PetscFunctionBegin;
986827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
987827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
988827bd09bSSatish Balay   size--;
989827bd09bSSatish Balay 
990827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
991827bd09bSSatish Balay   for (;;)
992827bd09bSSatish Balay     {
993827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
994827bd09bSSatish Balay       if (size > SORT_OPT)
995827bd09bSSatish Balay 	{
996827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
997827bd09bSSatish Balay 	  mid = size>>1;
998827bd09bSSatish Balay 	  pi = ar+1;
999827bd09bSSatish Balay 	  pj = ar+mid;
1000827bd09bSSatish Balay 	  pi2 = ar2+1;
1001827bd09bSSatish Balay 	  pj2 = ar2+mid;
1002827bd09bSSatish Balay 
1003827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1004827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1005827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1006827bd09bSSatish Balay 
1007827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1008827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1009827bd09bSSatish Balay 	  pj = ar+size;
1010827bd09bSSatish Balay 	  pj2 = ar2+size;
1011827bd09bSSatish Balay 	  if (*pi > *pj)
1012827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1013827bd09bSSatish Balay 	  if (*ar > *pj)
1014827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1015827bd09bSSatish Balay 	  else if (*pi > *ar)
1016827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1017827bd09bSSatish Balay 
1018827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1019827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1020827bd09bSSatish Balay 	  for(;;)
1021827bd09bSSatish Balay 	    {
1022827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1023827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1024827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1025827bd09bSSatish Balay 
1026827bd09bSSatish Balay 	      /* if we've crossed we're done */
1027827bd09bSSatish Balay 	      if (pj<pi) break;
1028827bd09bSSatish Balay 
1029827bd09bSSatish Balay 	      /* else swap */
1030827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1031827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1032827bd09bSSatish Balay 	    }
1033827bd09bSSatish Balay 
1034827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1035827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1036827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1037827bd09bSSatish Balay 
1038827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1039827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1040827bd09bSSatish Balay          {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");}
1041827bd09bSSatish Balay 
1042827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1043827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
1044827bd09bSSatish Balay 	    {
1045827bd09bSSatish Balay 	      *(top_a++) = pi;
1046827bd09bSSatish Balay 	      *(top_a++) = (int*) pi2;
1047827bd09bSSatish Balay 	      size -= *top_s+2;
1048827bd09bSSatish Balay 	      top_s++;
1049827bd09bSSatish Balay 	    }
1050827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1051827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1052827bd09bSSatish Balay 	    {;}
1053827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1054827bd09bSSatish Balay 	  else
1055827bd09bSSatish Balay 	    {
1056827bd09bSSatish Balay 	      ar2 = (int **) *(--top_a);
1057827bd09bSSatish Balay 	      ar  = *(--top_a);
1058827bd09bSSatish Balay 	      size = *(--top_s);
1059827bd09bSSatish Balay 	    }
1060827bd09bSSatish Balay 	}
1061827bd09bSSatish Balay 
1062827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1063827bd09bSSatish Balay       else
1064827bd09bSSatish Balay 	{
1065827bd09bSSatish Balay 	  /* insertion sort for bottom */
1066827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1067827bd09bSSatish Balay             {
1068827bd09bSSatish Balay               temp = *pj;
1069827bd09bSSatish Balay               ptr = *pj2;
1070827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1071827bd09bSSatish Balay                 {
1072827bd09bSSatish Balay                   if (*pi <= temp) break;
1073827bd09bSSatish Balay                   *(pi+1)=*pi;
1074827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1075827bd09bSSatish Balay                 }
1076827bd09bSSatish Balay               *(pi+1)=temp;
1077827bd09bSSatish Balay               *(pi2+1)=ptr;
1078827bd09bSSatish Balay 	    }
1079827bd09bSSatish Balay 
1080827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
10813fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1082827bd09bSSatish Balay 
1083827bd09bSSatish Balay 	  /* else pop another list from the stack */
1084827bd09bSSatish Balay 	  ar2 = (int **)*(--top_a);
1085827bd09bSSatish Balay 	  ar  = *(--top_a);
1086827bd09bSSatish Balay 	  size = *(--top_s);
1087827bd09bSSatish Balay 	}
1088827bd09bSSatish Balay     }
10893fdc5746SBarry Smith   PetscFunctionReturn(0);
1090827bd09bSSatish Balay }
1091827bd09bSSatish Balay 
1092827bd09bSSatish Balay 
1093827bd09bSSatish Balay 
1094827bd09bSSatish Balay /******************************************************************************
1095827bd09bSSatish Balay Function: SMI_sort().
1096827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1097827bd09bSSatish Balay Output: sorted list (in ascending order).
1098827bd09bSSatish Balay Return: none.
1099827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1100827bd09bSSatish Balay ******************************************************************************/
1101*0924e98cSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, int size, int type)
1102827bd09bSSatish Balay {
11033fdc5746SBarry Smith   PetscFunctionBegin;
1104827bd09bSSatish Balay   if (type == SORT_INTEGER)
1105827bd09bSSatish Balay     {
1106827bd09bSSatish Balay       if (ar2)
1107827bd09bSSatish Balay 	{ivec_sort_companion((int*)ar1,(int*)ar2,size);}
1108827bd09bSSatish Balay       else
1109827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1110827bd09bSSatish Balay     }
1111827bd09bSSatish Balay   else if (type == SORT_INT_PTR)
1112827bd09bSSatish Balay     {
1113827bd09bSSatish Balay       if (ar2)
1114827bd09bSSatish Balay 	{ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);}
1115827bd09bSSatish Balay       else
1116827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
1117827bd09bSSatish Balay     }
1118827bd09bSSatish Balay 
1119827bd09bSSatish Balay   else
1120827bd09bSSatish Balay     {
1121827bd09bSSatish Balay       error_msg_fatal("SMI_sort only does SORT_INTEGER!");
1122827bd09bSSatish Balay     }
11233fdc5746SBarry Smith   PetscFunctionReturn(0);
1124827bd09bSSatish Balay }
1125827bd09bSSatish Balay 
1126827bd09bSSatish Balay 
1127827bd09bSSatish Balay 
1128827bd09bSSatish Balay /**********************************ivec.c**************************************
1129827bd09bSSatish Balay Function ivec_linear_search()
1130827bd09bSSatish Balay 
1131827bd09bSSatish Balay Input :
1132827bd09bSSatish Balay Output:
1133827bd09bSSatish Balay Return:
1134827bd09bSSatish Balay Description:
1135827bd09bSSatish Balay ***********************************ivec.c*************************************/
1136827bd09bSSatish Balay int
1137a501084fSBarry Smith ivec_linear_search( int item,  int *list,  int n)
1138827bd09bSSatish Balay {
1139a501084fSBarry Smith    int tmp = n-1;
11403fdc5746SBarry Smith   PetscFunctionBegin;
1141827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
1142827bd09bSSatish Balay   return(-1);
1143827bd09bSSatish Balay }
1144827bd09bSSatish Balay 
1145827bd09bSSatish Balay 
1146827bd09bSSatish Balay 
1147827bd09bSSatish Balay /**********************************ivec.c**************************************
1148827bd09bSSatish Balay Function ivec_binary_search()
1149827bd09bSSatish Balay 
1150827bd09bSSatish Balay Input :
1151827bd09bSSatish Balay Output:
1152827bd09bSSatish Balay Return:
1153827bd09bSSatish Balay Description:
1154827bd09bSSatish Balay ***********************************ivec.c*************************************/
1155827bd09bSSatish Balay int
1156a501084fSBarry Smith ivec_binary_search( int item,  int *list,  int rh)
1157827bd09bSSatish Balay {
1158a501084fSBarry Smith    int mid, lh=0;
1159827bd09bSSatish Balay 
1160827bd09bSSatish Balay   rh--;
1161827bd09bSSatish Balay   while (lh<=rh)
1162827bd09bSSatish Balay     {
1163827bd09bSSatish Balay       mid = (lh+rh)>>1;
1164827bd09bSSatish Balay       if (*(list+mid) == item)
1165827bd09bSSatish Balay 	{return(mid);}
1166827bd09bSSatish Balay       if (*(list+mid) > item)
1167827bd09bSSatish Balay 	{rh = mid-1;}
1168827bd09bSSatish Balay       else
1169827bd09bSSatish Balay 	{lh = mid+1;}
1170827bd09bSSatish Balay     }
1171827bd09bSSatish Balay   return(-1);
1172827bd09bSSatish Balay }
1173827bd09bSSatish Balay 
1174827bd09bSSatish Balay 
1175827bd09bSSatish Balay 
1176827bd09bSSatish Balay /**********************************ivec.c**************************************
1177827bd09bSSatish Balay Function rvec_dump
1178827bd09bSSatish Balay 
1179827bd09bSSatish Balay Input :
1180827bd09bSSatish Balay Output:
1181827bd09bSSatish Balay Return:
1182827bd09bSSatish Balay Description:
1183827bd09bSSatish Balay ***********************************ivec.c*************************************/
1184*0924e98cSBarry Smith PetscErrorCode rvec_dump(PetscScalar *v, int n, int tag, int tag2, char * s)
1185827bd09bSSatish Balay {
1186827bd09bSSatish Balay   int i;
11873fdc5746SBarry Smith   PetscFunctionBegin;
1188827bd09bSSatish Balay   printf("%2d %2d %s %2d :: ",tag,tag2,s,my_id);
1189827bd09bSSatish Balay   for (i=0;i<n;i++)
1190827bd09bSSatish Balay     {printf("%f ",v[i]);}
1191827bd09bSSatish Balay   printf("\n");
1192827bd09bSSatish Balay   fflush(stdout);
11933fdc5746SBarry Smith   PetscFunctionReturn(0);
1194827bd09bSSatish Balay }
1195827bd09bSSatish Balay 
1196827bd09bSSatish Balay 
1197827bd09bSSatish Balay 
1198827bd09bSSatish Balay /**********************************ivec.c**************************************
1199827bd09bSSatish Balay Function rvec_lb_ub()
1200827bd09bSSatish Balay 
1201827bd09bSSatish Balay Input :
1202827bd09bSSatish Balay Output:
1203827bd09bSSatish Balay Return:
1204827bd09bSSatish Balay Description:
1205827bd09bSSatish Balay ***********************************ivec.c*************************************/
1206*0924e98cSBarry Smith PetscErrorCode rvec_lb_ub( PetscScalar *arg1,  int n, PetscScalar *lb, PetscScalar *ub)
1207827bd09bSSatish Balay {
1208a501084fSBarry Smith    PetscScalar min =  REAL_MAX;
1209a501084fSBarry Smith    PetscScalar max = -REAL_MAX;
1210827bd09bSSatish Balay 
12113fdc5746SBarry Smith   PetscFunctionBegin;
1212827bd09bSSatish Balay   while (n--)
1213827bd09bSSatish Balay     {
121439945688SSatish Balay      min = PetscMin(min,*arg1);
121539945688SSatish Balay      max = PetscMax(max,*arg1);
1216827bd09bSSatish Balay      arg1++;
1217827bd09bSSatish Balay     }
1218827bd09bSSatish Balay 
1219827bd09bSSatish Balay   *lb=min;
1220827bd09bSSatish Balay   *ub=max;
12213fdc5746SBarry Smith   PetscFunctionReturn(0);
1222827bd09bSSatish Balay }
1223827bd09bSSatish Balay 
1224827bd09bSSatish Balay 
1225827bd09bSSatish Balay 
1226827bd09bSSatish Balay /********************************ivec.c**************************************
1227827bd09bSSatish Balay Function rvec_copy()
1228827bd09bSSatish Balay 
1229827bd09bSSatish Balay Input :
1230827bd09bSSatish Balay Output:
1231827bd09bSSatish Balay Return:
1232827bd09bSSatish Balay Description:
1233827bd09bSSatish Balay *********************************ivec.c*************************************/
1234*0924e98cSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1235827bd09bSSatish Balay {
12363fdc5746SBarry Smith   PetscFunctionBegin;
1237827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
12383fdc5746SBarry Smith   PetscFunctionReturn(0);
1239827bd09bSSatish Balay }
1240827bd09bSSatish Balay 
1241827bd09bSSatish Balay 
1242827bd09bSSatish Balay 
1243827bd09bSSatish Balay /********************************ivec.c**************************************
1244827bd09bSSatish Balay Function rvec_zero()
1245827bd09bSSatish Balay 
1246827bd09bSSatish Balay Input :
1247827bd09bSSatish Balay Output:
1248827bd09bSSatish Balay Return:
1249827bd09bSSatish Balay Description:
1250827bd09bSSatish Balay *********************************ivec.c*************************************/
1251*0924e98cSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1,  int n)
1252827bd09bSSatish Balay {
12533fdc5746SBarry Smith   PetscFunctionBegin;
1254827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
12553fdc5746SBarry Smith   PetscFunctionReturn(0);
1256827bd09bSSatish Balay }
1257827bd09bSSatish Balay 
1258827bd09bSSatish Balay 
1259827bd09bSSatish Balay 
1260827bd09bSSatish Balay /**********************************ivec.c**************************************
1261827bd09bSSatish Balay Function rvec_one()
1262827bd09bSSatish Balay 
1263827bd09bSSatish Balay Input :
1264827bd09bSSatish Balay Output:
1265827bd09bSSatish Balay Return:
1266827bd09bSSatish Balay Description:
1267827bd09bSSatish Balay ***********************************ivec.c*************************************/
1268*0924e98cSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1,  int n)
1269827bd09bSSatish Balay {
12703fdc5746SBarry Smith   PetscFunctionBegin;
1271827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
12723fdc5746SBarry Smith   PetscFunctionReturn(0);
1273827bd09bSSatish Balay }
1274827bd09bSSatish Balay 
1275827bd09bSSatish Balay 
1276827bd09bSSatish Balay 
1277827bd09bSSatish Balay /**********************************ivec.c**************************************
1278827bd09bSSatish Balay Function rvec_neg_one()
1279827bd09bSSatish Balay 
1280827bd09bSSatish Balay Input :
1281827bd09bSSatish Balay Output:
1282827bd09bSSatish Balay Return:
1283827bd09bSSatish Balay Description:
1284827bd09bSSatish Balay ***********************************ivec.c*************************************/
1285*0924e98cSBarry Smith PetscErrorCode rvec_neg_one( PetscScalar *arg1,  int n)
1286827bd09bSSatish Balay {
12873fdc5746SBarry Smith   PetscFunctionBegin;
1288827bd09bSSatish Balay   while (n--)  {*arg1++ = -1.0;}
12893fdc5746SBarry Smith   PetscFunctionReturn(0);
1290827bd09bSSatish Balay }
1291827bd09bSSatish Balay 
1292827bd09bSSatish Balay 
1293827bd09bSSatish Balay 
1294827bd09bSSatish Balay /**********************************ivec.c**************************************
1295827bd09bSSatish Balay Function rvec_set()
1296827bd09bSSatish Balay 
1297827bd09bSSatish Balay Input :
1298827bd09bSSatish Balay Output:
1299827bd09bSSatish Balay Return:
1300827bd09bSSatish Balay Description:
1301827bd09bSSatish Balay ***********************************ivec.c*************************************/
1302*0924e98cSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1,  PetscScalar arg2,  int n)
1303827bd09bSSatish Balay {
13043fdc5746SBarry Smith   PetscFunctionBegin;
1305827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
13063fdc5746SBarry Smith   PetscFunctionReturn(0);
1307827bd09bSSatish Balay }
1308827bd09bSSatish Balay 
1309827bd09bSSatish Balay 
1310827bd09bSSatish Balay 
1311827bd09bSSatish Balay /**********************************ivec.c**************************************
1312827bd09bSSatish Balay Function rvec_scale()
1313827bd09bSSatish Balay 
1314827bd09bSSatish Balay Input :
1315827bd09bSSatish Balay Output:
1316827bd09bSSatish Balay Return:
1317827bd09bSSatish Balay Description:
1318827bd09bSSatish Balay ***********************************ivec.c*************************************/
1319*0924e98cSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1,  PetscScalar arg2,  int n)
1320827bd09bSSatish Balay {
13213fdc5746SBarry Smith   PetscFunctionBegin;
1322827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
13233fdc5746SBarry Smith   PetscFunctionReturn(0);
1324827bd09bSSatish Balay }
1325827bd09bSSatish Balay 
1326827bd09bSSatish Balay 
1327827bd09bSSatish Balay 
1328827bd09bSSatish Balay /********************************ivec.c**************************************
1329827bd09bSSatish Balay Function rvec_add()
1330827bd09bSSatish Balay 
1331827bd09bSSatish Balay Input :
1332827bd09bSSatish Balay Output:
1333827bd09bSSatish Balay Return:
1334827bd09bSSatish Balay Description:
1335827bd09bSSatish Balay *********************************ivec.c*************************************/
1336*0924e98cSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1337827bd09bSSatish Balay {
13383fdc5746SBarry Smith   PetscFunctionBegin;
1339827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
13403fdc5746SBarry Smith   PetscFunctionReturn(0);
1341827bd09bSSatish Balay }
1342827bd09bSSatish Balay 
1343827bd09bSSatish Balay 
1344827bd09bSSatish Balay 
1345827bd09bSSatish Balay /********************************ivec.c**************************************
1346827bd09bSSatish Balay Function rvec_dot()
1347827bd09bSSatish Balay 
1348827bd09bSSatish Balay Input :
1349827bd09bSSatish Balay Output:
1350827bd09bSSatish Balay Return:
1351827bd09bSSatish Balay Description:
1352827bd09bSSatish Balay *********************************ivec.c*************************************/
1353a501084fSBarry Smith PetscScalar
1354a501084fSBarry Smith rvec_dot( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1355827bd09bSSatish Balay {
1356a501084fSBarry Smith   PetscScalar dot=0.0;
1357827bd09bSSatish Balay 
1358827bd09bSSatish Balay   while (n--)  {dot+= *arg1++ * *arg2++;}
1359827bd09bSSatish Balay 
1360827bd09bSSatish Balay   return(dot);
1361827bd09bSSatish Balay }
1362827bd09bSSatish Balay 
1363827bd09bSSatish Balay 
1364827bd09bSSatish Balay 
1365827bd09bSSatish Balay /********************************ivec.c**************************************
1366827bd09bSSatish Balay Function rvec_axpy()
1367827bd09bSSatish Balay 
1368827bd09bSSatish Balay Input :
1369827bd09bSSatish Balay Output:
1370827bd09bSSatish Balay Return:
1371827bd09bSSatish Balay Description:
1372827bd09bSSatish Balay *********************************ivec.c*************************************/
1373*0924e98cSBarry Smith PetscErrorCode rvec_axpy( PetscScalar *arg1,  PetscScalar *arg2,  PetscScalar scale,
1374a501084fSBarry Smith 	   int n)
1375827bd09bSSatish Balay {
13763fdc5746SBarry Smith   PetscFunctionBegin;
1377827bd09bSSatish Balay   while (n--)  {*arg1++ += scale * *arg2++;}
13783fdc5746SBarry Smith   PetscFunctionReturn(0);
1379827bd09bSSatish Balay }
1380827bd09bSSatish Balay 
1381827bd09bSSatish Balay 
1382827bd09bSSatish Balay /********************************ivec.c**************************************
1383827bd09bSSatish Balay Function rvec_mult()
1384827bd09bSSatish Balay 
1385827bd09bSSatish Balay Input :
1386827bd09bSSatish Balay Output:
1387827bd09bSSatish Balay Return:
1388827bd09bSSatish Balay Description:
1389827bd09bSSatish Balay *********************************ivec.c*************************************/
1390*0924e98cSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1391827bd09bSSatish Balay {
13923fdc5746SBarry Smith   PetscFunctionBegin;
1393827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
13943fdc5746SBarry Smith   PetscFunctionReturn(0);
1395827bd09bSSatish Balay }
1396827bd09bSSatish Balay 
1397827bd09bSSatish Balay 
1398827bd09bSSatish Balay 
1399827bd09bSSatish Balay /********************************ivec.c**************************************
1400827bd09bSSatish Balay Function rvec_max()
1401827bd09bSSatish Balay 
1402827bd09bSSatish Balay Input :
1403827bd09bSSatish Balay Output:
1404827bd09bSSatish Balay Return:
1405827bd09bSSatish Balay Description:
1406827bd09bSSatish Balay *********************************ivec.c*************************************/
1407*0924e98cSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1408827bd09bSSatish Balay {
14093fdc5746SBarry Smith   PetscFunctionBegin;
141039945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
14113fdc5746SBarry Smith   PetscFunctionReturn(0);
1412827bd09bSSatish Balay }
1413827bd09bSSatish Balay 
1414827bd09bSSatish Balay 
1415827bd09bSSatish Balay 
1416827bd09bSSatish Balay /********************************ivec.c**************************************
1417827bd09bSSatish Balay Function rvec_max_abs()
1418827bd09bSSatish Balay 
1419827bd09bSSatish Balay Input :
1420827bd09bSSatish Balay Output:
1421827bd09bSSatish Balay Return:
1422827bd09bSSatish Balay Description:
1423827bd09bSSatish Balay *********************************ivec.c*************************************/
1424*0924e98cSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1425827bd09bSSatish Balay {
14263fdc5746SBarry Smith   PetscFunctionBegin;
1427827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
14283fdc5746SBarry Smith   PetscFunctionReturn(0);
1429827bd09bSSatish Balay }
1430827bd09bSSatish Balay 
1431827bd09bSSatish Balay 
1432827bd09bSSatish Balay 
1433827bd09bSSatish Balay /********************************ivec.c**************************************
1434827bd09bSSatish Balay Function rvec_min()
1435827bd09bSSatish Balay 
1436827bd09bSSatish Balay Input :
1437827bd09bSSatish Balay Output:
1438827bd09bSSatish Balay Return:
1439827bd09bSSatish Balay Description:
1440827bd09bSSatish Balay *********************************ivec.c*************************************/
1441*0924e98cSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1442827bd09bSSatish Balay {
14433fdc5746SBarry Smith   PetscFunctionBegin;
144439945688SSatish Balay   while (n--)  {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;}
14453fdc5746SBarry Smith   PetscFunctionReturn(0);
1446827bd09bSSatish Balay }
1447827bd09bSSatish Balay 
1448827bd09bSSatish Balay 
1449827bd09bSSatish Balay 
1450827bd09bSSatish Balay /********************************ivec.c**************************************
1451827bd09bSSatish Balay Function rvec_min_abs()
1452827bd09bSSatish Balay 
1453827bd09bSSatish Balay Input :
1454827bd09bSSatish Balay Output:
1455827bd09bSSatish Balay Return:
1456827bd09bSSatish Balay Description:
1457827bd09bSSatish Balay *********************************ivec.c*************************************/
1458*0924e98cSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1459827bd09bSSatish Balay {
14603fdc5746SBarry Smith   PetscFunctionBegin;
1461827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
14623fdc5746SBarry Smith   PetscFunctionReturn(0);
1463827bd09bSSatish Balay }
1464827bd09bSSatish Balay 
1465827bd09bSSatish Balay 
1466827bd09bSSatish Balay 
1467827bd09bSSatish Balay /********************************ivec.c**************************************
1468827bd09bSSatish Balay Function rvec_exists()
1469827bd09bSSatish Balay 
1470827bd09bSSatish Balay Input :
1471827bd09bSSatish Balay Output:
1472827bd09bSSatish Balay Return:
1473827bd09bSSatish Balay Description:
1474827bd09bSSatish Balay *********************************ivec.c*************************************/
1475*0924e98cSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1476827bd09bSSatish Balay {
14773fdc5746SBarry Smith   PetscFunctionBegin;
1478827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
14793fdc5746SBarry Smith   PetscFunctionReturn(0);
1480827bd09bSSatish Balay }
1481827bd09bSSatish Balay 
1482827bd09bSSatish Balay 
1483827bd09bSSatish Balay 
1484827bd09bSSatish Balay /**********************************ivec.c**************************************
1485827bd09bSSatish Balay Function rvec_non_uniform()
1486827bd09bSSatish Balay 
1487827bd09bSSatish Balay Input :
1488827bd09bSSatish Balay Output:
1489827bd09bSSatish Balay Return:
1490827bd09bSSatish Balay Description:
1491827bd09bSSatish Balay ***********************************ivec.c*************************************/
1492*0924e98cSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  int n,  int *arg3)
1493827bd09bSSatish Balay {
1494a501084fSBarry Smith    int i, j, type;
1495827bd09bSSatish Balay 
14963fdc5746SBarry Smith   PetscFunctionBegin;
1497827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
1498827bd09bSSatish Balay   for (i=0;i<n;)
1499827bd09bSSatish Balay     {
1500827bd09bSSatish Balay       /* clump 'em for now */
1501827bd09bSSatish Balay       j=i+1;
1502827bd09bSSatish Balay       type = arg3[i];
1503827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
1504827bd09bSSatish Balay 	{j++;}
1505827bd09bSSatish Balay 
1506827bd09bSSatish Balay       /* how many together */
1507827bd09bSSatish Balay       j -= i;
1508827bd09bSSatish Balay 
1509827bd09bSSatish Balay       /* call appropriate ivec function */
1510827bd09bSSatish Balay       if (type == GL_MAX)
1511827bd09bSSatish Balay 	{rvec_max(arg1,arg2,j);}
1512827bd09bSSatish Balay       else if (type == GL_MIN)
1513827bd09bSSatish Balay 	{rvec_min(arg1,arg2,j);}
1514827bd09bSSatish Balay       else if (type == GL_MULT)
1515827bd09bSSatish Balay 	{rvec_mult(arg1,arg2,j);}
1516827bd09bSSatish Balay       else if (type == GL_ADD)
1517827bd09bSSatish Balay 	{rvec_add(arg1,arg2,j);}
1518827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
1519827bd09bSSatish Balay 	{rvec_max_abs(arg1,arg2,j);}
1520827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
1521827bd09bSSatish Balay 	{rvec_min_abs(arg1,arg2,j);}
1522827bd09bSSatish Balay       else if (type == GL_EXISTS)
1523827bd09bSSatish Balay 	{rvec_exists(arg1,arg2,j);}
1524827bd09bSSatish Balay       else
1525827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");}
1526827bd09bSSatish Balay 
1527827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
1528827bd09bSSatish Balay     }
15293fdc5746SBarry Smith   PetscFunctionReturn(0);
1530827bd09bSSatish Balay }
1531827bd09bSSatish Balay 
1532827bd09bSSatish Balay 
1533827bd09bSSatish Balay 
1534827bd09bSSatish Balay /**********************************ivec.c**************************************
1535827bd09bSSatish Balay Function rvec_fct_addr()
1536827bd09bSSatish Balay 
1537827bd09bSSatish Balay Input :
1538827bd09bSSatish Balay Output:
1539827bd09bSSatish Balay Return:
1540827bd09bSSatish Balay Description:
1541827bd09bSSatish Balay ***********************************ivec.c*************************************/
1542a501084fSBarry Smith vfp rvec_fct_addr( int type)
1543827bd09bSSatish Balay {
1544827bd09bSSatish Balay   if (type == NON_UNIFORM)
15453fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);}
1546827bd09bSSatish Balay   else if (type == GL_MAX)
15473fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);}
1548827bd09bSSatish Balay   else if (type == GL_MIN)
15493fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);}
1550827bd09bSSatish Balay   else if (type == GL_MULT)
15513fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);}
1552827bd09bSSatish Balay   else if (type == GL_ADD)
15533fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);}
1554827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
15553fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);}
1556827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
15573fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);}
1558827bd09bSSatish Balay   else if (type == GL_EXISTS)
15593fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);}
1560827bd09bSSatish Balay 
1561827bd09bSSatish Balay   /* catch all ... not good if we get here */
1562827bd09bSSatish Balay   return(NULL);
1563827bd09bSSatish Balay }
1564827bd09bSSatish Balay 
1565827bd09bSSatish Balay 
1566827bd09bSSatish Balay /******************************************************************************
1567827bd09bSSatish Balay Function: my_sort().
1568827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1569827bd09bSSatish Balay Output: sorted list (in ascending order).
1570827bd09bSSatish Balay Return: none.
1571827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1572827bd09bSSatish Balay ******************************************************************************/
1573*0924e98cSBarry Smith PetscErrorCode rvec_sort( PetscScalar *ar,  int Size)
1574827bd09bSSatish Balay {
1575a501084fSBarry Smith    PetscScalar *pi, *pj, temp;
1576a501084fSBarry Smith    PetscScalar **top_a = (PetscScalar **)offset_stack;
1577a501084fSBarry Smith    long *top_s = psize_stack, *bottom_s = psize_stack;
1578a501084fSBarry Smith    long size = (long) Size;
1579827bd09bSSatish Balay 
15803fdc5746SBarry Smith   PetscFunctionBegin;
1581827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1582827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1583827bd09bSSatish Balay   size--;
1584827bd09bSSatish Balay 
1585827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1586827bd09bSSatish Balay   for (;;)
1587827bd09bSSatish Balay     {
1588827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1589827bd09bSSatish Balay       if (size > SORT_OPT)
1590827bd09bSSatish Balay 	{
1591827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1592827bd09bSSatish Balay 	  pi = ar+1;
1593827bd09bSSatish Balay 	  pj = ar+size;
1594827bd09bSSatish Balay 
1595827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1596827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
1597827bd09bSSatish Balay 
1598827bd09bSSatish Balay 	  pj = ar+size;
1599827bd09bSSatish Balay 
1600827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1601827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1602827bd09bSSatish Balay 	  if (*pi > *pj)
1603827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
1604827bd09bSSatish Balay 	  if (*ar > *pj)
1605827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
1606827bd09bSSatish Balay 	  else if (*pi > *ar)
1607827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
1608827bd09bSSatish Balay 
1609827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1610827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1611827bd09bSSatish Balay 	  for(;;)
1612827bd09bSSatish Balay 	    {
1613827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1614827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
1615827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
1616827bd09bSSatish Balay 
1617827bd09bSSatish Balay 	      /* if we've crossed we're done */
1618827bd09bSSatish Balay 	      if (pj<pi) break;
1619827bd09bSSatish Balay 
1620827bd09bSSatish Balay 	      /* else swap */
1621827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1622827bd09bSSatish Balay 	    }
1623827bd09bSSatish Balay 
1624827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1625827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1626827bd09bSSatish Balay 
1627827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1628827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1629827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1630827bd09bSSatish Balay 
1631827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1632827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1633827bd09bSSatish Balay 	    {
1634827bd09bSSatish Balay 	      *(top_a++) = pi;
1635827bd09bSSatish Balay 	      size -= *top_s+2;
1636827bd09bSSatish Balay 	      top_s++;
1637827bd09bSSatish Balay 	    }
1638827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1639827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1640827bd09bSSatish Balay 	    {;}
1641827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1642827bd09bSSatish Balay 	  else
1643827bd09bSSatish Balay 	    {
1644827bd09bSSatish Balay 	      ar = *(--top_a);
1645827bd09bSSatish Balay 	      size = *(--top_s);
1646827bd09bSSatish Balay 	    }
1647827bd09bSSatish Balay 	}
1648827bd09bSSatish Balay 
1649827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1650827bd09bSSatish Balay       else
1651827bd09bSSatish Balay 	{
1652827bd09bSSatish Balay 	  /* insertion sort for bottom */
1653827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
1654827bd09bSSatish Balay             {
1655827bd09bSSatish Balay               temp = *pj;
1656827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
1657827bd09bSSatish Balay                 {
1658827bd09bSSatish Balay                   if (*pi <= temp) break;
1659827bd09bSSatish Balay                   *(pi+1)=*pi;
1660827bd09bSSatish Balay                 }
1661827bd09bSSatish Balay               *(pi+1)=temp;
1662827bd09bSSatish Balay 	    }
1663827bd09bSSatish Balay 
1664827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
16653fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1666827bd09bSSatish Balay 
1667827bd09bSSatish Balay 	  /* else pop another list from the stack */
1668827bd09bSSatish Balay 	  ar = *(--top_a);
1669827bd09bSSatish Balay 	  size = *(--top_s);
1670827bd09bSSatish Balay 	}
1671827bd09bSSatish Balay     }
16723fdc5746SBarry Smith   PetscFunctionReturn(0);
1673827bd09bSSatish Balay }
1674827bd09bSSatish Balay 
1675827bd09bSSatish Balay 
1676827bd09bSSatish Balay 
1677827bd09bSSatish Balay /******************************************************************************
1678827bd09bSSatish Balay Function: my_sort().
1679827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
1680827bd09bSSatish Balay Output: sorted list (in ascending order).
1681827bd09bSSatish Balay Return: none.
1682827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
1683827bd09bSSatish Balay ******************************************************************************/
1684*0924e98cSBarry Smith PetscErrorCode rvec_sort_companion( PetscScalar *ar,  int *ar2,  int Size)
1685827bd09bSSatish Balay {
1686a501084fSBarry Smith    PetscScalar *pi, *pj, temp;
1687a501084fSBarry Smith    PetscScalar **top_a = (PetscScalar **)offset_stack;
1688a501084fSBarry Smith    long *top_s = psize_stack, *bottom_s = psize_stack;
1689a501084fSBarry Smith    long size = (long) Size;
1690827bd09bSSatish Balay 
1691a501084fSBarry Smith    int *pi2, *pj2;
1692a501084fSBarry Smith    int ptr;
1693a501084fSBarry Smith    long mid;
1694827bd09bSSatish Balay 
16953fdc5746SBarry Smith   PetscFunctionBegin;
1696827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
1697827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
1698827bd09bSSatish Balay   size--;
1699827bd09bSSatish Balay 
1700827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
1701827bd09bSSatish Balay   for (;;)
1702827bd09bSSatish Balay     {
1703827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
1704827bd09bSSatish Balay       if (size > SORT_OPT)
1705827bd09bSSatish Balay 	{
1706827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
1707827bd09bSSatish Balay 	  mid = size>>1;
1708827bd09bSSatish Balay 	  pi = ar+1;
1709827bd09bSSatish Balay 	  pj = ar+mid;
1710827bd09bSSatish Balay 	  pi2 = ar2+1;
1711827bd09bSSatish Balay 	  pj2 = ar2+mid;
1712827bd09bSSatish Balay 
1713827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
1714827bd09bSSatish Balay 	  SWAP(*pi,*pj)
1715827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
1716827bd09bSSatish Balay 
1717827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
1718827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
1719827bd09bSSatish Balay 	  pj = ar+size;
1720827bd09bSSatish Balay 	  pj2 = ar2+size;
1721827bd09bSSatish Balay 	  if (*pi > *pj)
1722827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
1723827bd09bSSatish Balay 	  if (*ar > *pj)
1724827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
1725827bd09bSSatish Balay 	  else if (*pi > *ar)
1726827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
1727827bd09bSSatish Balay 
1728827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
1729827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
1730827bd09bSSatish Balay 	  for(;;)
1731827bd09bSSatish Balay 	    {
1732827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
1733827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
1734827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
1735827bd09bSSatish Balay 
1736827bd09bSSatish Balay 	      /* if we've crossed we're done */
1737827bd09bSSatish Balay 	      if (pj<pi) break;
1738827bd09bSSatish Balay 
1739827bd09bSSatish Balay 	      /* else swap */
1740827bd09bSSatish Balay 	      SWAP(*pi,*pj)
1741827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
1742827bd09bSSatish Balay 	    }
1743827bd09bSSatish Balay 
1744827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
1745827bd09bSSatish Balay 	  SWAP(*ar,*pj)
1746827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
1747827bd09bSSatish Balay 
1748827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
1749827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
1750827bd09bSSatish Balay 	    {error_msg_fatal("\nSTACK EXHAUSTED!!!\n");}
1751827bd09bSSatish Balay 
1752827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
1753827bd09bSSatish Balay 	  if ((*top_s = size-(pi-ar)))
1754827bd09bSSatish Balay 	    {
1755827bd09bSSatish Balay 	      *(top_a++) = pi;
1756a501084fSBarry Smith 	      *(top_a++) = (PetscScalar *) pi2;
1757827bd09bSSatish Balay 	      size -= *top_s+2;
1758827bd09bSSatish Balay 	      top_s++;
1759827bd09bSSatish Balay 	    }
1760827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
1761827bd09bSSatish Balay 	  else if (size -= *top_s+2)
1762827bd09bSSatish Balay 	    {;}
1763827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
1764827bd09bSSatish Balay 	  else
1765827bd09bSSatish Balay 	    {
1766827bd09bSSatish Balay 	      ar2 = (int*) *(--top_a);
1767827bd09bSSatish Balay 	      ar  = *(--top_a);
1768827bd09bSSatish Balay 	      size = *(--top_s);
1769827bd09bSSatish Balay 	    }
1770827bd09bSSatish Balay 	}
1771827bd09bSSatish Balay 
1772827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
1773827bd09bSSatish Balay       else
1774827bd09bSSatish Balay 	{
1775827bd09bSSatish Balay 	  /* insertion sort for bottom */
1776827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
1777827bd09bSSatish Balay             {
1778827bd09bSSatish Balay               temp = *pj;
1779827bd09bSSatish Balay               ptr = *pj2;
1780827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
1781827bd09bSSatish Balay                 {
1782827bd09bSSatish Balay                   if (*pi <= temp) break;
1783827bd09bSSatish Balay                   *(pi+1)=*pi;
1784827bd09bSSatish Balay                   *(pi2+1)=*pi2;
1785827bd09bSSatish Balay                 }
1786827bd09bSSatish Balay               *(pi+1)=temp;
1787827bd09bSSatish Balay               *(pi2+1)=ptr;
1788827bd09bSSatish Balay 	    }
1789827bd09bSSatish Balay 
1790827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
17913fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
1792827bd09bSSatish Balay 
1793827bd09bSSatish Balay 	  /* else pop another list from the stack */
1794827bd09bSSatish Balay 	  ar2 = (int*) *(--top_a);
1795827bd09bSSatish Balay 	  ar  = *(--top_a);
1796827bd09bSSatish Balay 	  size = *(--top_s);
1797827bd09bSSatish Balay 	}
1798827bd09bSSatish Balay     }
17993fdc5746SBarry Smith   PetscFunctionReturn(0);
1800827bd09bSSatish Balay }
1801827bd09bSSatish Balay 
1802827bd09bSSatish Balay 
1803827bd09bSSatish Balay 
1804827bd09bSSatish Balay 
1805827bd09bSSatish Balay 
1806827bd09bSSatish Balay /**********************************ivec.c**************************************
1807827bd09bSSatish Balay Function ivec_binary_search()
1808827bd09bSSatish Balay 
1809827bd09bSSatish Balay Input :
1810827bd09bSSatish Balay Output:
1811827bd09bSSatish Balay Return:
1812827bd09bSSatish Balay Description:
1813827bd09bSSatish Balay ***********************************ivec.c*************************************/
1814827bd09bSSatish Balay int
1815a501084fSBarry Smith rvec_binary_search( PetscScalar item,  PetscScalar *list,  int rh)
1816827bd09bSSatish Balay {
1817a501084fSBarry Smith   int mid, lh=0;
18183fdc5746SBarry Smith   PetscFunctionBegin;
1819827bd09bSSatish Balay   rh--;
1820827bd09bSSatish Balay   while (lh<=rh)
1821827bd09bSSatish Balay     {
1822827bd09bSSatish Balay       mid = (lh+rh)>>1;
1823827bd09bSSatish Balay       if (*(list+mid) == item)
1824827bd09bSSatish Balay 	{return(mid);}
1825827bd09bSSatish Balay       if (*(list+mid) > item)
1826827bd09bSSatish Balay 	{rh = mid-1;}
1827827bd09bSSatish Balay       else
1828827bd09bSSatish Balay 	{lh = mid+1;}
1829827bd09bSSatish Balay     }
1830827bd09bSSatish Balay   return(-1);
1831827bd09bSSatish Balay }
1832827bd09bSSatish Balay 
1833827bd09bSSatish Balay 
1834827bd09bSSatish Balay 
1835827bd09bSSatish Balay 
1836827bd09bSSatish Balay 
1837