xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 1d7d09051fe52a3a6e6d1decb2e711a4db60a9c8)
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];
33827bd09bSSatish Balay 
34827bd09bSSatish Balay /**********************************ivec.c**************************************
35827bd09bSSatish Balay Function ivec_copy()
36827bd09bSSatish Balay 
37827bd09bSSatish Balay Input :
38827bd09bSSatish Balay Output:
39827bd09bSSatish Balay Return:
40827bd09bSSatish Balay Description:
41827bd09bSSatish Balay ***********************************ivec.c*************************************/
42a501084fSBarry Smith int *ivec_copy( int *arg1,  int *arg2,  int n)
43827bd09bSSatish Balay {
44827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
45827bd09bSSatish Balay   return(arg1);
46827bd09bSSatish Balay }
47827bd09bSSatish Balay 
48827bd09bSSatish Balay 
49827bd09bSSatish Balay 
50827bd09bSSatish Balay /**********************************ivec.c**************************************
51827bd09bSSatish Balay Function ivec_zero()
52827bd09bSSatish Balay 
53827bd09bSSatish Balay Input :
54827bd09bSSatish Balay Output:
55827bd09bSSatish Balay Return:
56827bd09bSSatish Balay Description:
57827bd09bSSatish Balay ***********************************ivec.c*************************************/
580924e98cSBarry Smith PetscErrorCode ivec_zero( int *arg1,  int n)
59827bd09bSSatish Balay {
603fdc5746SBarry Smith   PetscFunctionBegin;
61827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
623fdc5746SBarry Smith   PetscFunctionReturn(0);
63827bd09bSSatish Balay }
64827bd09bSSatish Balay 
65827bd09bSSatish Balay /**********************************ivec.c**************************************
66827bd09bSSatish Balay Function ivec_set()
67827bd09bSSatish Balay 
68827bd09bSSatish Balay Input :
69827bd09bSSatish Balay Output:
70827bd09bSSatish Balay Return:
71827bd09bSSatish Balay Description:
72827bd09bSSatish Balay ***********************************ivec.c*************************************/
730924e98cSBarry Smith PetscErrorCode ivec_set( int *arg1,  int arg2,  int n)
74827bd09bSSatish Balay {
753fdc5746SBarry Smith   PetscFunctionBegin;
76827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
773fdc5746SBarry Smith   PetscFunctionReturn(0);
78827bd09bSSatish Balay }
79827bd09bSSatish Balay 
80827bd09bSSatish Balay /**********************************ivec.c**************************************
81827bd09bSSatish Balay Function ivec_max()
82827bd09bSSatish Balay 
83827bd09bSSatish Balay Input :
84827bd09bSSatish Balay Output:
85827bd09bSSatish Balay Return:
86827bd09bSSatish Balay Description:
87827bd09bSSatish Balay ***********************************ivec.c*************************************/
880924e98cSBarry Smith PetscErrorCode ivec_max( int *arg1,  int *arg2,  int n)
89827bd09bSSatish Balay {
903fdc5746SBarry Smith   PetscFunctionBegin;
9139945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
923fdc5746SBarry Smith   PetscFunctionReturn(0);
93827bd09bSSatish Balay }
94827bd09bSSatish Balay 
95827bd09bSSatish Balay 
96827bd09bSSatish Balay 
97827bd09bSSatish Balay /**********************************ivec.c**************************************
98827bd09bSSatish Balay Function ivec_min()
99827bd09bSSatish Balay 
100827bd09bSSatish Balay Input :
101827bd09bSSatish Balay Output:
102827bd09bSSatish Balay Return:
103827bd09bSSatish Balay Description:
104827bd09bSSatish Balay ***********************************ivec.c*************************************/
1050924e98cSBarry Smith PetscErrorCode ivec_min( int *arg1,  int *arg2,  int n)
106827bd09bSSatish Balay {
1073fdc5746SBarry Smith   PetscFunctionBegin;
10839945688SSatish Balay   while (n--)  {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;}
1093fdc5746SBarry Smith   PetscFunctionReturn(0);
110827bd09bSSatish Balay }
111827bd09bSSatish Balay 
112827bd09bSSatish Balay 
113827bd09bSSatish Balay 
114827bd09bSSatish Balay /**********************************ivec.c**************************************
115827bd09bSSatish Balay Function ivec_mult()
116827bd09bSSatish Balay 
117827bd09bSSatish Balay Input :
118827bd09bSSatish Balay Output:
119827bd09bSSatish Balay Return:
120827bd09bSSatish Balay Description:
121827bd09bSSatish Balay ***********************************ivec.c*************************************/
1220924e98cSBarry Smith PetscErrorCode ivec_mult( int *arg1,  int *arg2,  int n)
123827bd09bSSatish Balay {
1243fdc5746SBarry Smith   PetscFunctionBegin;
125827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
1263fdc5746SBarry Smith   PetscFunctionReturn(0);
127827bd09bSSatish Balay }
128827bd09bSSatish Balay 
129827bd09bSSatish Balay 
130827bd09bSSatish Balay 
131827bd09bSSatish Balay /**********************************ivec.c**************************************
132827bd09bSSatish Balay Function ivec_add()
133827bd09bSSatish Balay 
134827bd09bSSatish Balay Input :
135827bd09bSSatish Balay Output:
136827bd09bSSatish Balay Return:
137827bd09bSSatish Balay Description:
138827bd09bSSatish Balay ***********************************ivec.c*************************************/
1390924e98cSBarry Smith PetscErrorCode ivec_add( int *arg1,  int *arg2,  int n)
140827bd09bSSatish Balay {
1413fdc5746SBarry Smith   PetscFunctionBegin;
142827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
1433fdc5746SBarry Smith   PetscFunctionReturn(0);
144827bd09bSSatish Balay }
145827bd09bSSatish Balay 
146827bd09bSSatish Balay 
147827bd09bSSatish Balay 
148827bd09bSSatish Balay /**********************************ivec.c**************************************
149827bd09bSSatish Balay Function ivec_lxor()
150827bd09bSSatish Balay 
151827bd09bSSatish Balay Input :
152827bd09bSSatish Balay Output:
153827bd09bSSatish Balay Return:
154827bd09bSSatish Balay Description:
155827bd09bSSatish Balay ***********************************ivec.c*************************************/
1560924e98cSBarry Smith PetscErrorCode ivec_lxor( int *arg1,  int *arg2,  int n)
157827bd09bSSatish Balay {
1583fdc5746SBarry Smith   PetscFunctionBegin;
159827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
1603fdc5746SBarry Smith   PetscFunctionReturn(0);
161827bd09bSSatish Balay }
162827bd09bSSatish Balay 
163827bd09bSSatish Balay 
164827bd09bSSatish Balay 
165827bd09bSSatish Balay /**********************************ivec.c**************************************
166827bd09bSSatish Balay Function ivec_xor()
167827bd09bSSatish Balay 
168827bd09bSSatish Balay Input :
169827bd09bSSatish Balay Output:
170827bd09bSSatish Balay Return:
171827bd09bSSatish Balay Description:
172827bd09bSSatish Balay ***********************************ivec.c*************************************/
1730924e98cSBarry Smith PetscErrorCode ivec_xor( int *arg1,  int *arg2,  int n)
174827bd09bSSatish Balay {
1753fdc5746SBarry Smith   PetscFunctionBegin;
176827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
1773fdc5746SBarry Smith   PetscFunctionReturn(0);
178827bd09bSSatish Balay }
179827bd09bSSatish Balay 
180827bd09bSSatish Balay 
181827bd09bSSatish Balay 
182827bd09bSSatish Balay /**********************************ivec.c**************************************
183827bd09bSSatish Balay Function ivec_or()
184827bd09bSSatish Balay 
185827bd09bSSatish Balay Input :
186827bd09bSSatish Balay Output:
187827bd09bSSatish Balay Return:
188827bd09bSSatish Balay Description:
189827bd09bSSatish Balay ***********************************ivec.c*************************************/
1900924e98cSBarry Smith PetscErrorCode ivec_or( int *arg1,  int *arg2,  int n)
191827bd09bSSatish Balay {
1923fdc5746SBarry Smith   PetscFunctionBegin;
193827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
1943fdc5746SBarry Smith   PetscFunctionReturn(0);
195827bd09bSSatish Balay }
196827bd09bSSatish Balay 
197827bd09bSSatish Balay 
198827bd09bSSatish Balay 
199827bd09bSSatish Balay /**********************************ivec.c**************************************
200827bd09bSSatish Balay Function ivec_lor()
201827bd09bSSatish Balay 
202827bd09bSSatish Balay Input :
203827bd09bSSatish Balay Output:
204827bd09bSSatish Balay Return:
205827bd09bSSatish Balay Description:
206827bd09bSSatish Balay ***********************************ivec.c*************************************/
2070924e98cSBarry Smith PetscErrorCode ivec_lor( int *arg1,  int *arg2,  int n)
208827bd09bSSatish Balay {
2093fdc5746SBarry Smith   PetscFunctionBegin;
210827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
2113fdc5746SBarry Smith   PetscFunctionReturn(0);
212827bd09bSSatish Balay }
213827bd09bSSatish Balay 
214827bd09bSSatish Balay /**********************************ivec.c**************************************
215827bd09bSSatish Balay Function ivec_and()
216827bd09bSSatish Balay 
217827bd09bSSatish Balay Input :
218827bd09bSSatish Balay Output:
219827bd09bSSatish Balay Return:
220827bd09bSSatish Balay Description:
221827bd09bSSatish Balay ***********************************ivec.c*************************************/
2220924e98cSBarry Smith PetscErrorCode ivec_and( int *arg1,  int *arg2,  int n)
223827bd09bSSatish Balay {
2243fdc5746SBarry Smith   PetscFunctionBegin;
225827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
2263fdc5746SBarry Smith   PetscFunctionReturn(0);
227827bd09bSSatish Balay }
228827bd09bSSatish Balay 
229827bd09bSSatish Balay 
230827bd09bSSatish Balay 
231827bd09bSSatish Balay /**********************************ivec.c**************************************
232827bd09bSSatish Balay Function ivec_land()
233827bd09bSSatish Balay 
234827bd09bSSatish Balay Input :
235827bd09bSSatish Balay Output:
236827bd09bSSatish Balay Return:
237827bd09bSSatish Balay Description:
238827bd09bSSatish Balay ***********************************ivec.c*************************************/
2390924e98cSBarry Smith PetscErrorCode ivec_land( int *arg1,  int *arg2,  int n)
240827bd09bSSatish Balay {
2413fdc5746SBarry Smith   PetscFunctionBegin;
242827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
2433fdc5746SBarry Smith   PetscFunctionReturn(0);
244827bd09bSSatish Balay }
245827bd09bSSatish Balay 
246827bd09bSSatish Balay 
247827bd09bSSatish Balay 
248827bd09bSSatish Balay /**********************************ivec.c**************************************
249827bd09bSSatish Balay Function ivec_and3()
250827bd09bSSatish Balay 
251827bd09bSSatish Balay Input :
252827bd09bSSatish Balay Output:
253827bd09bSSatish Balay Return:
254827bd09bSSatish Balay Description:
255827bd09bSSatish Balay ***********************************ivec.c*************************************/
2560924e98cSBarry Smith PetscErrorCode ivec_and3( int *arg1,  int *arg2,  int *arg3, int n)
257827bd09bSSatish Balay {
2583fdc5746SBarry Smith   PetscFunctionBegin;
259827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
2603fdc5746SBarry Smith   PetscFunctionReturn(0);
261827bd09bSSatish Balay }
262827bd09bSSatish Balay 
263827bd09bSSatish Balay 
264827bd09bSSatish Balay 
265827bd09bSSatish Balay /**********************************ivec.c**************************************
266827bd09bSSatish Balay Function ivec_sum
267827bd09bSSatish Balay 
268827bd09bSSatish Balay Input :
269827bd09bSSatish Balay Output:
270827bd09bSSatish Balay Return:
271827bd09bSSatish Balay Description:
272827bd09bSSatish Balay ***********************************ivec.c*************************************/
273a501084fSBarry Smith int ivec_sum( int *arg1,  int n)
274827bd09bSSatish Balay {
275a501084fSBarry Smith    int tmp = 0;
276827bd09bSSatish Balay 
277827bd09bSSatish Balay 
278827bd09bSSatish Balay   while (n--) {tmp += *arg1++;}
279827bd09bSSatish Balay   return(tmp);
280827bd09bSSatish Balay }
281827bd09bSSatish Balay 
282827bd09bSSatish Balay /**********************************ivec.c**************************************
283827bd09bSSatish Balay Function ivec_non_uniform()
284827bd09bSSatish Balay 
285827bd09bSSatish Balay Input :
286827bd09bSSatish Balay Output:
287827bd09bSSatish Balay Return:
288827bd09bSSatish Balay Description:
289827bd09bSSatish Balay ***********************************ivec.c*************************************/
2900924e98cSBarry Smith PetscErrorCode ivec_non_uniform(int *arg1, int *arg2,  int n,  int *arg3)
291827bd09bSSatish Balay {
292a501084fSBarry Smith    int i, j, type;
293827bd09bSSatish Balay 
294827bd09bSSatish Balay 
2953fdc5746SBarry Smith   PetscFunctionBegin;
296827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
297827bd09bSSatish Balay   for (i=0;i<n;)
298827bd09bSSatish Balay     {
299827bd09bSSatish Balay       /* clump 'em for now */
300827bd09bSSatish Balay       j=i+1;
301827bd09bSSatish Balay       type = arg3[i];
302827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
303827bd09bSSatish Balay 	{j++;}
304827bd09bSSatish Balay 
305827bd09bSSatish Balay       /* how many together */
306827bd09bSSatish Balay       j -= i;
307827bd09bSSatish Balay 
308827bd09bSSatish Balay       /* call appropriate ivec function */
309827bd09bSSatish Balay       if (type == GL_MAX)
310827bd09bSSatish Balay 	{ivec_max(arg1,arg2,j);}
311827bd09bSSatish Balay       else if (type == GL_MIN)
312827bd09bSSatish Balay 	{ivec_min(arg1,arg2,j);}
313827bd09bSSatish Balay       else if (type == GL_MULT)
314827bd09bSSatish Balay 	{ivec_mult(arg1,arg2,j);}
315827bd09bSSatish Balay       else if (type == GL_ADD)
316827bd09bSSatish Balay 	{ivec_add(arg1,arg2,j);}
317827bd09bSSatish Balay       else if (type == GL_B_XOR)
318827bd09bSSatish Balay 	{ivec_xor(arg1,arg2,j);}
319827bd09bSSatish Balay       else if (type == GL_B_OR)
320827bd09bSSatish Balay 	{ivec_or(arg1,arg2,j);}
321827bd09bSSatish Balay       else if (type == GL_B_AND)
322827bd09bSSatish Balay 	{ivec_and(arg1,arg2,j);}
323827bd09bSSatish Balay       else if (type == GL_L_XOR)
324827bd09bSSatish Balay 	{ivec_lxor(arg1,arg2,j);}
325827bd09bSSatish Balay       else if (type == GL_L_OR)
326827bd09bSSatish Balay 	{ivec_lor(arg1,arg2,j);}
327827bd09bSSatish Balay       else if (type == GL_L_AND)
328827bd09bSSatish Balay 	{ivec_land(arg1,arg2,j);}
329827bd09bSSatish Balay       else
330827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to ivec_non_uniform()!");}
331827bd09bSSatish Balay 
332827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
333827bd09bSSatish Balay     }
3343fdc5746SBarry Smith   PetscFunctionReturn(0);
335827bd09bSSatish Balay }
336827bd09bSSatish Balay 
337827bd09bSSatish Balay 
338827bd09bSSatish Balay 
339827bd09bSSatish Balay /**********************************ivec.c**************************************
340827bd09bSSatish Balay Function ivec_addr()
341827bd09bSSatish Balay 
342827bd09bSSatish Balay Input :
343827bd09bSSatish Balay Output:
344827bd09bSSatish Balay Return:
345827bd09bSSatish Balay Description:
346827bd09bSSatish Balay ***********************************ivec.c*************************************/
347a501084fSBarry Smith vfp ivec_fct_addr( int type)
348827bd09bSSatish Balay {
3493fdc5746SBarry Smith   PetscFunctionBegin;
350827bd09bSSatish Balay   if (type == NON_UNIFORM)
3513fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_non_uniform);}
352827bd09bSSatish Balay   else if (type == GL_MAX)
3533fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_max);}
354827bd09bSSatish Balay   else if (type == GL_MIN)
3553fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_min);}
356827bd09bSSatish Balay   else if (type == GL_MULT)
3573fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_mult);}
358827bd09bSSatish Balay   else if (type == GL_ADD)
3593fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_add);}
360827bd09bSSatish Balay   else if (type == GL_B_XOR)
3613fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_xor);}
362827bd09bSSatish Balay   else if (type == GL_B_OR)
3633fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_or);}
364827bd09bSSatish Balay   else if (type == GL_B_AND)
3653fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_and);}
366827bd09bSSatish Balay   else if (type == GL_L_XOR)
3673fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lxor);}
368827bd09bSSatish Balay   else if (type == GL_L_OR)
3693fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_lor);}
370827bd09bSSatish Balay   else if (type == GL_L_AND)
3713fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&ivec_land);}
372827bd09bSSatish Balay 
373827bd09bSSatish Balay   /* catch all ... not good if we get here */
374827bd09bSSatish Balay   return(NULL);
375827bd09bSSatish Balay }
376827bd09bSSatish Balay 
377827bd09bSSatish Balay 
378827bd09bSSatish Balay /******************************************************************************
379827bd09bSSatish Balay Function: ivec_sort().
380827bd09bSSatish Balay 
381827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
382827bd09bSSatish Balay Output: sorted list (in ascending order).
383827bd09bSSatish Balay Return: none.
384827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
385827bd09bSSatish Balay ******************************************************************************/
3860924e98cSBarry Smith PetscErrorCode ivec_sort( int *ar,  int size)
387827bd09bSSatish Balay {
388a501084fSBarry Smith    int *pi, *pj, temp;
389a501084fSBarry Smith    int **top_a = (int **) offset_stack;
390a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
391827bd09bSSatish Balay 
392827bd09bSSatish Balay 
393827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
394827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
395827bd09bSSatish Balay   size--;
396827bd09bSSatish Balay 
397827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
398827bd09bSSatish Balay   for (;;)
399827bd09bSSatish Balay     {
400827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
401827bd09bSSatish Balay       if (size > SORT_OPT)
402827bd09bSSatish Balay 	{
403827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
404827bd09bSSatish Balay 	  pi = ar+1;
405827bd09bSSatish Balay 	  pj = ar+size;
406827bd09bSSatish Balay 
407827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
408827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
409827bd09bSSatish Balay 
410827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
411827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
412827bd09bSSatish Balay 	  if (*pi > *pj)
413827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
414827bd09bSSatish Balay 	  if (*ar > *pj)
415827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
416827bd09bSSatish Balay 	  else if (*pi > *ar)
417827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
418827bd09bSSatish Balay 
419827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
420827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
421827bd09bSSatish Balay 	  for(;;)
422827bd09bSSatish Balay 	    {
423827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
424827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
425827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
426827bd09bSSatish Balay 
427827bd09bSSatish Balay 	      /* if we've crossed we're done */
428827bd09bSSatish Balay 	      if (pj<pi) break;
429827bd09bSSatish Balay 
430827bd09bSSatish Balay 	      /* else swap */
431827bd09bSSatish Balay 	      SWAP(*pi,*pj)
432827bd09bSSatish Balay 	    }
433827bd09bSSatish Balay 
434827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
435827bd09bSSatish Balay 	  SWAP(*ar,*pj)
436827bd09bSSatish Balay 
437827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
438827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
439827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort() :: STACK EXHAUSTED!!!");}
440827bd09bSSatish Balay 
441827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
442827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
443827bd09bSSatish Balay 	    {
444827bd09bSSatish Balay 	      *(top_a++) = pi;
445827bd09bSSatish Balay 	      size -= *top_s+2;
446827bd09bSSatish Balay 	      top_s++;
447827bd09bSSatish Balay 	    }
448827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
449827bd09bSSatish Balay 	  else if (size -= *top_s+2)
450827bd09bSSatish Balay 	    {;}
451827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
452827bd09bSSatish Balay 	  else
453827bd09bSSatish Balay 	    {
454827bd09bSSatish Balay 	      ar = *(--top_a);
455827bd09bSSatish Balay 	      size = *(--top_s);
456827bd09bSSatish Balay 	    }
457827bd09bSSatish Balay 	}
458827bd09bSSatish Balay 
459827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
460827bd09bSSatish Balay       else
461827bd09bSSatish Balay 	{
462827bd09bSSatish Balay 	  /* insertion sort for bottom */
463827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
464827bd09bSSatish Balay             {
465827bd09bSSatish Balay               temp = *pj;
466827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
467827bd09bSSatish Balay                 {
468827bd09bSSatish Balay                   if (*pi <= temp) break;
469827bd09bSSatish Balay                   *(pi+1)=*pi;
470827bd09bSSatish Balay                 }
471827bd09bSSatish Balay               *(pi+1)=temp;
472827bd09bSSatish Balay 	    }
473827bd09bSSatish Balay 
474827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
4753fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
476827bd09bSSatish Balay 
477827bd09bSSatish Balay 	  /* else pop another list from the stack */
478827bd09bSSatish Balay 	  ar = *(--top_a);
479827bd09bSSatish Balay 	  size = *(--top_s);
480827bd09bSSatish Balay 	}
481827bd09bSSatish Balay     }
4823fdc5746SBarry Smith   PetscFunctionReturn(0);
483827bd09bSSatish Balay }
484827bd09bSSatish Balay 
485827bd09bSSatish Balay 
486827bd09bSSatish Balay 
487827bd09bSSatish Balay /******************************************************************************
488827bd09bSSatish Balay Function: ivec_sort_companion().
489827bd09bSSatish Balay 
490827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
491827bd09bSSatish Balay Output: sorted list (in ascending order).
492827bd09bSSatish Balay Return: none.
493827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
494827bd09bSSatish Balay ******************************************************************************/
4950924e98cSBarry Smith PetscErrorCode ivec_sort_companion( int *ar,  int *ar2,  int size)
496827bd09bSSatish Balay {
497a501084fSBarry Smith    int *pi, *pj, temp, temp2;
498a501084fSBarry Smith    int **top_a = (int **)offset_stack;
499a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
500a501084fSBarry Smith    int *pi2, *pj2;
501a501084fSBarry Smith    int mid;
502827bd09bSSatish Balay 
5033fdc5746SBarry Smith   PetscFunctionBegin;
504827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
505827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
506827bd09bSSatish Balay   size--;
507827bd09bSSatish Balay 
508827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
509827bd09bSSatish Balay   for (;;)
510827bd09bSSatish Balay     {
511827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
512827bd09bSSatish Balay       if (size > SORT_OPT)
513827bd09bSSatish Balay 	{
514827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
515827bd09bSSatish Balay 	  mid = size>>1;
516827bd09bSSatish Balay 	  pi = ar+1;
517827bd09bSSatish Balay 	  pj = ar+mid;
518827bd09bSSatish Balay 	  pi2 = ar2+1;
519827bd09bSSatish Balay 	  pj2 = ar2+mid;
520827bd09bSSatish Balay 
521827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
522827bd09bSSatish Balay 	  SWAP(*pi,*pj)
523827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
524827bd09bSSatish Balay 
525827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
526827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
527827bd09bSSatish Balay 	  pj = ar+size;
528827bd09bSSatish Balay 	  pj2 = ar2+size;
529827bd09bSSatish Balay 	  if (*pi > *pj)
530827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
531827bd09bSSatish Balay 	  if (*ar > *pj)
532827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
533827bd09bSSatish Balay 	  else if (*pi > *ar)
534827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
535827bd09bSSatish Balay 
536827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
537827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
538827bd09bSSatish Balay 	  for(;;)
539827bd09bSSatish Balay 	    {
540827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
541827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
542827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
543827bd09bSSatish Balay 
544827bd09bSSatish Balay 	      /* if we've crossed we're done */
545827bd09bSSatish Balay 	      if (pj<pi) break;
546827bd09bSSatish Balay 
547827bd09bSSatish Balay 	      /* else swap */
548827bd09bSSatish Balay 	      SWAP(*pi,*pj)
549827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
550827bd09bSSatish Balay 	    }
551827bd09bSSatish Balay 
552827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
553827bd09bSSatish Balay 	  SWAP(*ar,*pj)
554827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
555827bd09bSSatish Balay 
556827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
557827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
558827bd09bSSatish Balay 	    {error_msg_fatal("ivec_sort_companion() :: STACK EXHAUSTED!!!");}
559827bd09bSSatish Balay 
560827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
561827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
562827bd09bSSatish Balay 	    {
563827bd09bSSatish Balay 	      *(top_a++) = pi;
564827bd09bSSatish Balay 	      *(top_a++) = pi2;
565827bd09bSSatish Balay 	      size -= *top_s+2;
566827bd09bSSatish Balay 	      top_s++;
567827bd09bSSatish Balay 	    }
568827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
569827bd09bSSatish Balay 	  else if (size -= *top_s+2)
570827bd09bSSatish Balay 	    {;}
571827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
572827bd09bSSatish Balay 	  else
573827bd09bSSatish Balay 	    {
574827bd09bSSatish Balay 	      ar2 = *(--top_a);
575827bd09bSSatish Balay 	      ar  = *(--top_a);
576827bd09bSSatish Balay 	      size = *(--top_s);
577827bd09bSSatish Balay 	    }
578827bd09bSSatish Balay 	}
579827bd09bSSatish Balay 
580827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
581827bd09bSSatish Balay       else
582827bd09bSSatish Balay 	{
583827bd09bSSatish Balay 	  /* insertion sort for bottom */
584827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
585827bd09bSSatish Balay             {
586827bd09bSSatish Balay               temp = *pj;
587827bd09bSSatish Balay               temp2 = *pj2;
588827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
589827bd09bSSatish Balay                 {
590827bd09bSSatish Balay                   if (*pi <= temp) break;
591827bd09bSSatish Balay                   *(pi+1)=*pi;
592827bd09bSSatish Balay                   *(pi2+1)=*pi2;
593827bd09bSSatish Balay                 }
594827bd09bSSatish Balay               *(pi+1)=temp;
595827bd09bSSatish Balay               *(pi2+1)=temp2;
596827bd09bSSatish Balay 	    }
597827bd09bSSatish Balay 
598827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
5993fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
600827bd09bSSatish Balay 
601827bd09bSSatish Balay 	  /* else pop another list from the stack */
602827bd09bSSatish Balay 	  ar2 = *(--top_a);
603827bd09bSSatish Balay 	  ar  = *(--top_a);
604827bd09bSSatish Balay 	  size = *(--top_s);
605827bd09bSSatish Balay 	}
606827bd09bSSatish Balay     }
6073fdc5746SBarry Smith   PetscFunctionReturn(0);
608827bd09bSSatish Balay }
609827bd09bSSatish Balay 
610827bd09bSSatish Balay 
611827bd09bSSatish Balay 
612827bd09bSSatish Balay /******************************************************************************
613827bd09bSSatish Balay Function: ivec_sort_companion_hack().
614827bd09bSSatish Balay 
615827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
616827bd09bSSatish Balay Output: sorted list (in ascending order).
617827bd09bSSatish Balay Return: none.
618827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
619827bd09bSSatish Balay ******************************************************************************/
620*1d7d0905SBarry Smith PetscErrorCode ivec_sort_companion_hack( int *ar,  int **ar2, int size)
621827bd09bSSatish Balay {
622a501084fSBarry Smith    int *pi, *pj, temp, *ptr;
623a501084fSBarry Smith    int **top_a = (int **)offset_stack;
624a501084fSBarry Smith    int *top_s = size_stack, *bottom_s = size_stack;
625a501084fSBarry Smith    int **pi2, **pj2;
626a501084fSBarry Smith    int mid;
627827bd09bSSatish Balay 
6283fdc5746SBarry Smith   PetscFunctionBegin;
629827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
630827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
631827bd09bSSatish Balay   size--;
632827bd09bSSatish Balay 
633827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
634827bd09bSSatish Balay   for (;;)
635827bd09bSSatish Balay     {
636827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
637827bd09bSSatish Balay       if (size > SORT_OPT)
638827bd09bSSatish Balay 	{
639827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
640827bd09bSSatish Balay 	  mid = size>>1;
641827bd09bSSatish Balay 	  pi = ar+1;
642827bd09bSSatish Balay 	  pj = ar+mid;
643827bd09bSSatish Balay 	  pi2 = ar2+1;
644827bd09bSSatish Balay 	  pj2 = ar2+mid;
645827bd09bSSatish Balay 
646827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
647827bd09bSSatish Balay 	  SWAP(*pi,*pj)
648827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
649827bd09bSSatish Balay 
650827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
651827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
652827bd09bSSatish Balay 	  pj = ar+size;
653827bd09bSSatish Balay 	  pj2 = ar2+size;
654827bd09bSSatish Balay 	  if (*pi > *pj)
655827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
656827bd09bSSatish Balay 	  if (*ar > *pj)
657827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
658827bd09bSSatish Balay 	  else if (*pi > *ar)
659827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
660827bd09bSSatish Balay 
661827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
662827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
663827bd09bSSatish Balay 	  for(;;)
664827bd09bSSatish Balay 	    {
665827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
666827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
667827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
668827bd09bSSatish Balay 
669827bd09bSSatish Balay 	      /* if we've crossed we're done */
670827bd09bSSatish Balay 	      if (pj<pi) break;
671827bd09bSSatish Balay 
672827bd09bSSatish Balay 	      /* else swap */
673827bd09bSSatish Balay 	      SWAP(*pi,*pj)
674827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
675827bd09bSSatish Balay 	    }
676827bd09bSSatish Balay 
677827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
678827bd09bSSatish Balay 	  SWAP(*ar,*pj)
679827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
680827bd09bSSatish Balay 
681827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
682827bd09bSSatish Balay 	  if (top_s-bottom_s >= SORT_STACK)
683827bd09bSSatish Balay          {error_msg_fatal("ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");}
684827bd09bSSatish Balay 
685827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
686827bd09bSSatish Balay 	  if ((*top_s = size-((int) (pi-ar))))
687827bd09bSSatish Balay 	    {
688827bd09bSSatish Balay 	      *(top_a++) = pi;
689827bd09bSSatish Balay 	      *(top_a++) = (int*) pi2;
690827bd09bSSatish Balay 	      size -= *top_s+2;
691827bd09bSSatish Balay 	      top_s++;
692827bd09bSSatish Balay 	    }
693827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
694827bd09bSSatish Balay 	  else if (size -= *top_s+2)
695827bd09bSSatish Balay 	    {;}
696827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
697827bd09bSSatish Balay 	  else
698827bd09bSSatish Balay 	    {
699827bd09bSSatish Balay 	      ar2 = (int **) *(--top_a);
700827bd09bSSatish Balay 	      ar  = *(--top_a);
701827bd09bSSatish Balay 	      size = *(--top_s);
702827bd09bSSatish Balay 	    }
703827bd09bSSatish Balay 	}
704827bd09bSSatish Balay 
705827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
706827bd09bSSatish Balay       else
707827bd09bSSatish Balay 	{
708827bd09bSSatish Balay 	  /* insertion sort for bottom */
709827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
710827bd09bSSatish Balay             {
711827bd09bSSatish Balay               temp = *pj;
712827bd09bSSatish Balay               ptr = *pj2;
713827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
714827bd09bSSatish Balay                 {
715827bd09bSSatish Balay                   if (*pi <= temp) break;
716827bd09bSSatish Balay                   *(pi+1)=*pi;
717827bd09bSSatish Balay                   *(pi2+1)=*pi2;
718827bd09bSSatish Balay                 }
719827bd09bSSatish Balay               *(pi+1)=temp;
720827bd09bSSatish Balay               *(pi2+1)=ptr;
721827bd09bSSatish Balay 	    }
722827bd09bSSatish Balay 
723827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
7243fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
725827bd09bSSatish Balay 
726827bd09bSSatish Balay 	  /* else pop another list from the stack */
727827bd09bSSatish Balay 	  ar2 = (int **)*(--top_a);
728827bd09bSSatish Balay 	  ar  = *(--top_a);
729827bd09bSSatish Balay 	  size = *(--top_s);
730827bd09bSSatish Balay 	}
731827bd09bSSatish Balay     }
7323fdc5746SBarry Smith   PetscFunctionReturn(0);
733827bd09bSSatish Balay }
734827bd09bSSatish Balay 
735827bd09bSSatish Balay 
736827bd09bSSatish Balay 
737827bd09bSSatish Balay /******************************************************************************
738827bd09bSSatish Balay Function: SMI_sort().
739827bd09bSSatish Balay Input : offset of list to be sorted, number of elements to be sorted.
740827bd09bSSatish Balay Output: sorted list (in ascending order).
741827bd09bSSatish Balay Return: none.
742827bd09bSSatish Balay Description: stack based (nonrecursive) quicksort w/brute-shell bottom.
743827bd09bSSatish Balay ******************************************************************************/
7440924e98cSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, int size, int type)
745827bd09bSSatish Balay {
7463fdc5746SBarry Smith   PetscFunctionBegin;
747827bd09bSSatish Balay   if (type == SORT_INTEGER)
748827bd09bSSatish Balay     {
749827bd09bSSatish Balay       if (ar2)
750827bd09bSSatish Balay 	{ivec_sort_companion((int*)ar1,(int*)ar2,size);}
751827bd09bSSatish Balay       else
752827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
753827bd09bSSatish Balay     }
754827bd09bSSatish Balay   else if (type == SORT_INT_PTR)
755827bd09bSSatish Balay     {
756827bd09bSSatish Balay       if (ar2)
757827bd09bSSatish Balay 	{ivec_sort_companion_hack((int*)ar1,(int **)ar2,size);}
758827bd09bSSatish Balay       else
759827bd09bSSatish Balay 	{ivec_sort((int*)ar1,size);}
760827bd09bSSatish Balay     }
761827bd09bSSatish Balay 
762827bd09bSSatish Balay   else
763827bd09bSSatish Balay     {
764827bd09bSSatish Balay       error_msg_fatal("SMI_sort only does SORT_INTEGER!");
765827bd09bSSatish Balay     }
7663fdc5746SBarry Smith   PetscFunctionReturn(0);
767827bd09bSSatish Balay }
768827bd09bSSatish Balay 
769827bd09bSSatish Balay 
770827bd09bSSatish Balay 
771827bd09bSSatish Balay /**********************************ivec.c**************************************
772827bd09bSSatish Balay Function ivec_linear_search()
773827bd09bSSatish Balay 
774827bd09bSSatish Balay Input :
775827bd09bSSatish Balay Output:
776827bd09bSSatish Balay Return:
777827bd09bSSatish Balay Description:
778827bd09bSSatish Balay ***********************************ivec.c*************************************/
779827bd09bSSatish Balay int
780a501084fSBarry Smith ivec_linear_search( int item,  int *list,  int n)
781827bd09bSSatish Balay {
782a501084fSBarry Smith    int tmp = n-1;
7833fdc5746SBarry Smith   PetscFunctionBegin;
784827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
785827bd09bSSatish Balay   return(-1);
786827bd09bSSatish Balay }
787827bd09bSSatish Balay 
788827bd09bSSatish Balay 
789827bd09bSSatish Balay 
790827bd09bSSatish Balay /**********************************ivec.c**************************************
791827bd09bSSatish Balay Function ivec_binary_search()
792827bd09bSSatish Balay 
793827bd09bSSatish Balay Input :
794827bd09bSSatish Balay Output:
795827bd09bSSatish Balay Return:
796827bd09bSSatish Balay Description:
797827bd09bSSatish Balay ***********************************ivec.c*************************************/
798827bd09bSSatish Balay int
799a501084fSBarry Smith ivec_binary_search( int item,  int *list,  int rh)
800827bd09bSSatish Balay {
801a501084fSBarry Smith    int mid, lh=0;
802827bd09bSSatish Balay 
803827bd09bSSatish Balay   rh--;
804827bd09bSSatish Balay   while (lh<=rh)
805827bd09bSSatish Balay     {
806827bd09bSSatish Balay       mid = (lh+rh)>>1;
807827bd09bSSatish Balay       if (*(list+mid) == item)
808827bd09bSSatish Balay 	{return(mid);}
809827bd09bSSatish Balay       if (*(list+mid) > item)
810827bd09bSSatish Balay 	{rh = mid-1;}
811827bd09bSSatish Balay       else
812827bd09bSSatish Balay 	{lh = mid+1;}
813827bd09bSSatish Balay     }
814827bd09bSSatish Balay   return(-1);
815827bd09bSSatish Balay }
816827bd09bSSatish Balay 
817827bd09bSSatish Balay 
818827bd09bSSatish Balay /********************************ivec.c**************************************
819827bd09bSSatish Balay Function rvec_copy()
820827bd09bSSatish Balay 
821827bd09bSSatish Balay Input :
822827bd09bSSatish Balay Output:
823827bd09bSSatish Balay Return:
824827bd09bSSatish Balay Description:
825827bd09bSSatish Balay *********************************ivec.c*************************************/
8260924e98cSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1,  PetscScalar *arg2,  int n)
827827bd09bSSatish Balay {
8283fdc5746SBarry Smith   PetscFunctionBegin;
829827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
8303fdc5746SBarry Smith   PetscFunctionReturn(0);
831827bd09bSSatish Balay }
832827bd09bSSatish Balay 
833827bd09bSSatish Balay 
834827bd09bSSatish Balay 
835827bd09bSSatish Balay /********************************ivec.c**************************************
836827bd09bSSatish Balay Function rvec_zero()
837827bd09bSSatish Balay 
838827bd09bSSatish Balay Input :
839827bd09bSSatish Balay Output:
840827bd09bSSatish Balay Return:
841827bd09bSSatish Balay Description:
842827bd09bSSatish Balay *********************************ivec.c*************************************/
8430924e98cSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1,  int n)
844827bd09bSSatish Balay {
8453fdc5746SBarry Smith   PetscFunctionBegin;
846827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
8473fdc5746SBarry Smith   PetscFunctionReturn(0);
848827bd09bSSatish Balay }
849827bd09bSSatish Balay 
850827bd09bSSatish Balay 
851827bd09bSSatish Balay 
852827bd09bSSatish Balay /**********************************ivec.c**************************************
853827bd09bSSatish Balay Function rvec_one()
854827bd09bSSatish Balay 
855827bd09bSSatish Balay Input :
856827bd09bSSatish Balay Output:
857827bd09bSSatish Balay Return:
858827bd09bSSatish Balay Description:
859827bd09bSSatish Balay ***********************************ivec.c*************************************/
8600924e98cSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1,  int n)
861827bd09bSSatish Balay {
8623fdc5746SBarry Smith   PetscFunctionBegin;
863827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
8643fdc5746SBarry Smith   PetscFunctionReturn(0);
865827bd09bSSatish Balay }
866827bd09bSSatish Balay 
867827bd09bSSatish Balay /**********************************ivec.c**************************************
868827bd09bSSatish Balay Function rvec_set()
869827bd09bSSatish Balay 
870827bd09bSSatish Balay Input :
871827bd09bSSatish Balay Output:
872827bd09bSSatish Balay Return:
873827bd09bSSatish Balay Description:
874827bd09bSSatish Balay ***********************************ivec.c*************************************/
8750924e98cSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1,  PetscScalar arg2,  int n)
876827bd09bSSatish Balay {
8773fdc5746SBarry Smith   PetscFunctionBegin;
878827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
8793fdc5746SBarry Smith   PetscFunctionReturn(0);
880827bd09bSSatish Balay }
881827bd09bSSatish Balay 
882827bd09bSSatish Balay 
883827bd09bSSatish Balay 
884827bd09bSSatish Balay /**********************************ivec.c**************************************
885827bd09bSSatish Balay Function rvec_scale()
886827bd09bSSatish Balay 
887827bd09bSSatish Balay Input :
888827bd09bSSatish Balay Output:
889827bd09bSSatish Balay Return:
890827bd09bSSatish Balay Description:
891827bd09bSSatish Balay ***********************************ivec.c*************************************/
8920924e98cSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1,  PetscScalar arg2,  int n)
893827bd09bSSatish Balay {
8943fdc5746SBarry Smith   PetscFunctionBegin;
895827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
8963fdc5746SBarry Smith   PetscFunctionReturn(0);
897827bd09bSSatish Balay }
898827bd09bSSatish Balay 
899827bd09bSSatish Balay 
900827bd09bSSatish Balay 
901827bd09bSSatish Balay /********************************ivec.c**************************************
902827bd09bSSatish Balay Function rvec_add()
903827bd09bSSatish Balay 
904827bd09bSSatish Balay Input :
905827bd09bSSatish Balay Output:
906827bd09bSSatish Balay Return:
907827bd09bSSatish Balay Description:
908827bd09bSSatish Balay *********************************ivec.c*************************************/
9090924e98cSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1,  PetscScalar *arg2,  int n)
910827bd09bSSatish Balay {
9113fdc5746SBarry Smith   PetscFunctionBegin;
912827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
9133fdc5746SBarry Smith   PetscFunctionReturn(0);
914827bd09bSSatish Balay }
915827bd09bSSatish Balay 
916827bd09bSSatish Balay /********************************ivec.c**************************************
917827bd09bSSatish Balay Function rvec_mult()
918827bd09bSSatish Balay 
919827bd09bSSatish Balay Input :
920827bd09bSSatish Balay Output:
921827bd09bSSatish Balay Return:
922827bd09bSSatish Balay Description:
923827bd09bSSatish Balay *********************************ivec.c*************************************/
9240924e98cSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1,  PetscScalar *arg2,  int n)
925827bd09bSSatish Balay {
9263fdc5746SBarry Smith   PetscFunctionBegin;
927827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
9283fdc5746SBarry Smith   PetscFunctionReturn(0);
929827bd09bSSatish Balay }
930827bd09bSSatish Balay 
931827bd09bSSatish Balay 
932827bd09bSSatish Balay 
933827bd09bSSatish Balay /********************************ivec.c**************************************
934827bd09bSSatish Balay Function rvec_max()
935827bd09bSSatish Balay 
936827bd09bSSatish Balay Input :
937827bd09bSSatish Balay Output:
938827bd09bSSatish Balay Return:
939827bd09bSSatish Balay Description:
940827bd09bSSatish Balay *********************************ivec.c*************************************/
9410924e98cSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1,  PetscScalar *arg2,  int n)
942827bd09bSSatish Balay {
9433fdc5746SBarry Smith   PetscFunctionBegin;
94439945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
9453fdc5746SBarry Smith   PetscFunctionReturn(0);
946827bd09bSSatish Balay }
947827bd09bSSatish Balay 
948827bd09bSSatish Balay 
949827bd09bSSatish Balay 
950827bd09bSSatish Balay /********************************ivec.c**************************************
951827bd09bSSatish Balay Function rvec_max_abs()
952827bd09bSSatish Balay 
953827bd09bSSatish Balay Input :
954827bd09bSSatish Balay Output:
955827bd09bSSatish Balay Return:
956827bd09bSSatish Balay Description:
957827bd09bSSatish Balay *********************************ivec.c*************************************/
9580924e98cSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
959827bd09bSSatish Balay {
9603fdc5746SBarry Smith   PetscFunctionBegin;
961827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
9623fdc5746SBarry Smith   PetscFunctionReturn(0);
963827bd09bSSatish Balay }
964827bd09bSSatish Balay 
965827bd09bSSatish Balay 
966827bd09bSSatish Balay 
967827bd09bSSatish Balay /********************************ivec.c**************************************
968827bd09bSSatish Balay Function rvec_min()
969827bd09bSSatish Balay 
970827bd09bSSatish Balay Input :
971827bd09bSSatish Balay Output:
972827bd09bSSatish Balay Return:
973827bd09bSSatish Balay Description:
974827bd09bSSatish Balay *********************************ivec.c*************************************/
9750924e98cSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1,  PetscScalar *arg2,  int n)
976827bd09bSSatish Balay {
9773fdc5746SBarry Smith   PetscFunctionBegin;
97839945688SSatish Balay   while (n--)  {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;}
9793fdc5746SBarry Smith   PetscFunctionReturn(0);
980827bd09bSSatish Balay }
981827bd09bSSatish Balay 
982827bd09bSSatish Balay 
983827bd09bSSatish Balay 
984827bd09bSSatish Balay /********************************ivec.c**************************************
985827bd09bSSatish Balay Function rvec_min_abs()
986827bd09bSSatish Balay 
987827bd09bSSatish Balay Input :
988827bd09bSSatish Balay Output:
989827bd09bSSatish Balay Return:
990827bd09bSSatish Balay Description:
991827bd09bSSatish Balay *********************************ivec.c*************************************/
9920924e98cSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1,  PetscScalar *arg2,  int n)
993827bd09bSSatish Balay {
9943fdc5746SBarry Smith   PetscFunctionBegin;
995827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
9963fdc5746SBarry Smith   PetscFunctionReturn(0);
997827bd09bSSatish Balay }
998827bd09bSSatish Balay 
999827bd09bSSatish Balay 
1000827bd09bSSatish Balay 
1001827bd09bSSatish Balay /********************************ivec.c**************************************
1002827bd09bSSatish Balay Function rvec_exists()
1003827bd09bSSatish Balay 
1004827bd09bSSatish Balay Input :
1005827bd09bSSatish Balay Output:
1006827bd09bSSatish Balay Return:
1007827bd09bSSatish Balay Description:
1008827bd09bSSatish Balay *********************************ivec.c*************************************/
10090924e98cSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1,  PetscScalar *arg2,  int n)
1010827bd09bSSatish Balay {
10113fdc5746SBarry Smith   PetscFunctionBegin;
1012827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
10133fdc5746SBarry Smith   PetscFunctionReturn(0);
1014827bd09bSSatish Balay }
1015827bd09bSSatish Balay 
1016827bd09bSSatish Balay 
1017827bd09bSSatish Balay 
1018827bd09bSSatish Balay /**********************************ivec.c**************************************
1019827bd09bSSatish Balay Function rvec_non_uniform()
1020827bd09bSSatish Balay 
1021827bd09bSSatish Balay Input :
1022827bd09bSSatish Balay Output:
1023827bd09bSSatish Balay Return:
1024827bd09bSSatish Balay Description:
1025827bd09bSSatish Balay ***********************************ivec.c*************************************/
10260924e98cSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  int n,  int *arg3)
1027827bd09bSSatish Balay {
1028a501084fSBarry Smith    int i, j, type;
1029827bd09bSSatish Balay 
10303fdc5746SBarry Smith   PetscFunctionBegin;
1031827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
1032827bd09bSSatish Balay   for (i=0;i<n;)
1033827bd09bSSatish Balay     {
1034827bd09bSSatish Balay       /* clump 'em for now */
1035827bd09bSSatish Balay       j=i+1;
1036827bd09bSSatish Balay       type = arg3[i];
1037827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
1038827bd09bSSatish Balay 	{j++;}
1039827bd09bSSatish Balay 
1040827bd09bSSatish Balay       /* how many together */
1041827bd09bSSatish Balay       j -= i;
1042827bd09bSSatish Balay 
1043827bd09bSSatish Balay       /* call appropriate ivec function */
1044827bd09bSSatish Balay       if (type == GL_MAX)
1045827bd09bSSatish Balay 	{rvec_max(arg1,arg2,j);}
1046827bd09bSSatish Balay       else if (type == GL_MIN)
1047827bd09bSSatish Balay 	{rvec_min(arg1,arg2,j);}
1048827bd09bSSatish Balay       else if (type == GL_MULT)
1049827bd09bSSatish Balay 	{rvec_mult(arg1,arg2,j);}
1050827bd09bSSatish Balay       else if (type == GL_ADD)
1051827bd09bSSatish Balay 	{rvec_add(arg1,arg2,j);}
1052827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
1053827bd09bSSatish Balay 	{rvec_max_abs(arg1,arg2,j);}
1054827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
1055827bd09bSSatish Balay 	{rvec_min_abs(arg1,arg2,j);}
1056827bd09bSSatish Balay       else if (type == GL_EXISTS)
1057827bd09bSSatish Balay 	{rvec_exists(arg1,arg2,j);}
1058827bd09bSSatish Balay       else
1059827bd09bSSatish Balay 	{error_msg_fatal("unrecognized type passed to rvec_non_uniform()!");}
1060827bd09bSSatish Balay 
1061827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
1062827bd09bSSatish Balay     }
10633fdc5746SBarry Smith   PetscFunctionReturn(0);
1064827bd09bSSatish Balay }
1065827bd09bSSatish Balay 
1066827bd09bSSatish Balay 
1067827bd09bSSatish Balay 
1068827bd09bSSatish Balay /**********************************ivec.c**************************************
1069827bd09bSSatish Balay Function rvec_fct_addr()
1070827bd09bSSatish Balay 
1071827bd09bSSatish Balay Input :
1072827bd09bSSatish Balay Output:
1073827bd09bSSatish Balay Return:
1074827bd09bSSatish Balay Description:
1075827bd09bSSatish Balay ***********************************ivec.c*************************************/
1076a501084fSBarry Smith vfp rvec_fct_addr( int type)
1077827bd09bSSatish Balay {
1078827bd09bSSatish Balay   if (type == NON_UNIFORM)
10793fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_non_uniform);}
1080827bd09bSSatish Balay   else if (type == GL_MAX)
10813fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max);}
1082827bd09bSSatish Balay   else if (type == GL_MIN)
10833fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min);}
1084827bd09bSSatish Balay   else if (type == GL_MULT)
10853fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_mult);}
1086827bd09bSSatish Balay   else if (type == GL_ADD)
10873fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_add);}
1088827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
10893fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_max_abs);}
1090827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
10913fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_min_abs);}
1092827bd09bSSatish Balay   else if (type == GL_EXISTS)
10933fdc5746SBarry Smith     {return((PetscErrorCode (*)(void*, void *, int, ...))&rvec_exists);}
1094827bd09bSSatish Balay 
1095827bd09bSSatish Balay   /* catch all ... not good if we get here */
1096827bd09bSSatish Balay   return(NULL);
1097827bd09bSSatish Balay }
1098827bd09bSSatish Balay 
1099827bd09bSSatish Balay 
1100827bd09bSSatish Balay 
1101827bd09bSSatish Balay 
1102827bd09bSSatish Balay 
1103827bd09bSSatish Balay 
1104