xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision e7e72b3d0edcd0d15e7f68c03be08666507fc872)
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 
187c4f633dSBarry Smith #include "../src/ksp/pc/impls/tfs/tfs.h"
19827bd09bSSatish Balay 
20827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */
21827bd09bSSatish Balay #define   SORT_OPT	6
22827bd09bSSatish Balay #define   SORT_STACK	50000
23827bd09bSSatish Balay 
24827bd09bSSatish Balay 
25827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */
26827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK];
2752f87cdaSBarry Smith static PetscInt   size_stack[SORT_STACK];
28827bd09bSSatish Balay 
297b1ae94cSBarry Smith /***********************************ivec.c*************************************/
3052f87cdaSBarry Smith PetscInt *ivec_copy( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
31827bd09bSSatish Balay {
32827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
33827bd09bSSatish Balay   return(arg1);
34827bd09bSSatish Balay }
35827bd09bSSatish Balay 
367b1ae94cSBarry Smith /***********************************ivec.c*************************************/
3752f87cdaSBarry Smith PetscErrorCode ivec_zero( PetscInt *arg1,  PetscInt n)
38827bd09bSSatish Balay {
393fdc5746SBarry Smith   PetscFunctionBegin;
40827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
413fdc5746SBarry Smith   PetscFunctionReturn(0);
42827bd09bSSatish Balay }
43827bd09bSSatish Balay 
447b1ae94cSBarry Smith /***********************************ivec.c*************************************/
4552f87cdaSBarry Smith PetscErrorCode ivec_set( PetscInt *arg1,  PetscInt arg2,  PetscInt n)
46827bd09bSSatish Balay {
473fdc5746SBarry Smith   PetscFunctionBegin;
48827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
493fdc5746SBarry Smith   PetscFunctionReturn(0);
50827bd09bSSatish Balay }
51827bd09bSSatish Balay 
527b1ae94cSBarry Smith /***********************************ivec.c*************************************/
5352f87cdaSBarry Smith PetscErrorCode ivec_max( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
54827bd09bSSatish Balay {
553fdc5746SBarry Smith   PetscFunctionBegin;
5639945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
573fdc5746SBarry Smith   PetscFunctionReturn(0);
58827bd09bSSatish Balay }
59827bd09bSSatish Balay 
607b1ae94cSBarry Smith /***********************************ivec.c*************************************/
6152f87cdaSBarry Smith PetscErrorCode ivec_min( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
62827bd09bSSatish Balay {
633fdc5746SBarry Smith   PetscFunctionBegin;
6439945688SSatish Balay   while (n--)  {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;}
653fdc5746SBarry Smith   PetscFunctionReturn(0);
66827bd09bSSatish Balay }
67827bd09bSSatish Balay 
687b1ae94cSBarry Smith /***********************************ivec.c*************************************/
6952f87cdaSBarry Smith PetscErrorCode ivec_mult( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
70827bd09bSSatish Balay {
713fdc5746SBarry Smith   PetscFunctionBegin;
72827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
733fdc5746SBarry Smith   PetscFunctionReturn(0);
74827bd09bSSatish Balay }
75827bd09bSSatish Balay 
767b1ae94cSBarry Smith /***********************************ivec.c*************************************/
7752f87cdaSBarry Smith PetscErrorCode ivec_add( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
78827bd09bSSatish Balay {
793fdc5746SBarry Smith   PetscFunctionBegin;
80827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
813fdc5746SBarry Smith   PetscFunctionReturn(0);
82827bd09bSSatish Balay }
83827bd09bSSatish Balay 
847b1ae94cSBarry Smith /***********************************ivec.c*************************************/
8552f87cdaSBarry Smith PetscErrorCode ivec_lxor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
86827bd09bSSatish Balay {
873fdc5746SBarry Smith   PetscFunctionBegin;
88827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
893fdc5746SBarry Smith   PetscFunctionReturn(0);
90827bd09bSSatish Balay }
91827bd09bSSatish Balay 
927b1ae94cSBarry Smith /***********************************ivec.c*************************************/
9352f87cdaSBarry Smith PetscErrorCode ivec_xor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
94827bd09bSSatish Balay {
953fdc5746SBarry Smith   PetscFunctionBegin;
96827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
973fdc5746SBarry Smith   PetscFunctionReturn(0);
98827bd09bSSatish Balay }
99827bd09bSSatish Balay 
1007b1ae94cSBarry Smith /***********************************ivec.c*************************************/
10152f87cdaSBarry Smith PetscErrorCode ivec_or( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
102827bd09bSSatish Balay {
1033fdc5746SBarry Smith   PetscFunctionBegin;
104827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
1053fdc5746SBarry Smith   PetscFunctionReturn(0);
106827bd09bSSatish Balay }
107827bd09bSSatish Balay 
1087b1ae94cSBarry Smith /***********************************ivec.c*************************************/
10952f87cdaSBarry Smith PetscErrorCode ivec_lor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
110827bd09bSSatish Balay {
1113fdc5746SBarry Smith   PetscFunctionBegin;
112827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
1133fdc5746SBarry Smith   PetscFunctionReturn(0);
114827bd09bSSatish Balay }
115827bd09bSSatish Balay 
1167b1ae94cSBarry Smith /***********************************ivec.c*************************************/
11752f87cdaSBarry Smith PetscErrorCode ivec_and( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
118827bd09bSSatish Balay {
1193fdc5746SBarry Smith   PetscFunctionBegin;
120827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
1213fdc5746SBarry Smith   PetscFunctionReturn(0);
122827bd09bSSatish Balay }
123827bd09bSSatish Balay 
1247b1ae94cSBarry Smith /***********************************ivec.c*************************************/
12552f87cdaSBarry Smith PetscErrorCode ivec_land( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
126827bd09bSSatish Balay {
1273fdc5746SBarry Smith   PetscFunctionBegin;
128827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
1293fdc5746SBarry Smith   PetscFunctionReturn(0);
130827bd09bSSatish Balay }
131827bd09bSSatish Balay 
1327b1ae94cSBarry Smith /***********************************ivec.c*************************************/
13352f87cdaSBarry Smith PetscErrorCode ivec_and3( PetscInt *arg1,  PetscInt *arg2,  PetscInt *arg3, PetscInt n)
134827bd09bSSatish Balay {
1353fdc5746SBarry Smith   PetscFunctionBegin;
136827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
1373fdc5746SBarry Smith   PetscFunctionReturn(0);
138827bd09bSSatish Balay }
139827bd09bSSatish Balay 
1407b1ae94cSBarry Smith /***********************************ivec.c*************************************/
14152f87cdaSBarry Smith PetscInt ivec_sum( PetscInt *arg1,  PetscInt n)
142827bd09bSSatish Balay {
14352f87cdaSBarry Smith    PetscInt tmp = 0;
144827bd09bSSatish Balay 
145827bd09bSSatish Balay 
146827bd09bSSatish Balay   while (n--) {tmp += *arg1++;}
147827bd09bSSatish Balay   return(tmp);
148827bd09bSSatish Balay }
149827bd09bSSatish Balay 
1507b1ae94cSBarry Smith /***********************************ivec.c*************************************/
15152f87cdaSBarry Smith PetscErrorCode ivec_non_uniform(PetscInt *arg1, PetscInt *arg2,  PetscInt n,  PetscInt *arg3)
152827bd09bSSatish Balay {
15352f87cdaSBarry Smith    PetscInt i, j, type;
154827bd09bSSatish Balay 
155827bd09bSSatish Balay 
1563fdc5746SBarry Smith   PetscFunctionBegin;
157827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
158827bd09bSSatish Balay   for (i=0;i<n;)
159827bd09bSSatish Balay     {
160827bd09bSSatish Balay       /* clump 'em for now */
161827bd09bSSatish Balay       j=i+1;
162827bd09bSSatish Balay       type = arg3[i];
163827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
164827bd09bSSatish Balay 	{j++;}
165827bd09bSSatish Balay 
166827bd09bSSatish Balay       /* how many together */
167827bd09bSSatish Balay       j -= i;
168827bd09bSSatish Balay 
169827bd09bSSatish Balay       /* call appropriate ivec function */
170827bd09bSSatish Balay       if (type == GL_MAX)
171827bd09bSSatish Balay 	{ivec_max(arg1,arg2,j);}
172827bd09bSSatish Balay       else if (type == GL_MIN)
173827bd09bSSatish Balay 	{ivec_min(arg1,arg2,j);}
174827bd09bSSatish Balay       else if (type == GL_MULT)
175827bd09bSSatish Balay 	{ivec_mult(arg1,arg2,j);}
176827bd09bSSatish Balay       else if (type == GL_ADD)
177827bd09bSSatish Balay 	{ivec_add(arg1,arg2,j);}
178827bd09bSSatish Balay       else if (type == GL_B_XOR)
179827bd09bSSatish Balay 	{ivec_xor(arg1,arg2,j);}
180827bd09bSSatish Balay       else if (type == GL_B_OR)
181827bd09bSSatish Balay 	{ivec_or(arg1,arg2,j);}
182827bd09bSSatish Balay       else if (type == GL_B_AND)
183827bd09bSSatish Balay 	{ivec_and(arg1,arg2,j);}
184827bd09bSSatish Balay       else if (type == GL_L_XOR)
185827bd09bSSatish Balay 	{ivec_lxor(arg1,arg2,j);}
186827bd09bSSatish Balay       else if (type == GL_L_OR)
187827bd09bSSatish Balay 	{ivec_lor(arg1,arg2,j);}
188827bd09bSSatish Balay       else if (type == GL_L_AND)
189827bd09bSSatish Balay 	{ivec_land(arg1,arg2,j);}
190827bd09bSSatish Balay       else
191*e7e72b3dSBarry Smith 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to ivec_non_uniform()!");
192827bd09bSSatish Balay 
193827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
194827bd09bSSatish Balay     }
1953fdc5746SBarry Smith   PetscFunctionReturn(0);
196827bd09bSSatish Balay }
197827bd09bSSatish Balay 
1987b1ae94cSBarry Smith /***********************************ivec.c*************************************/
19952f87cdaSBarry Smith vfp ivec_fct_addr( PetscInt type)
200827bd09bSSatish Balay {
2013fdc5746SBarry Smith   PetscFunctionBegin;
202827bd09bSSatish Balay   if (type == NON_UNIFORM)
20371a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_non_uniform);}
204827bd09bSSatish Balay   else if (type == GL_MAX)
20571a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_max);}
206827bd09bSSatish Balay   else if (type == GL_MIN)
20771a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_min);}
208827bd09bSSatish Balay   else if (type == GL_MULT)
20971a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_mult);}
210827bd09bSSatish Balay   else if (type == GL_ADD)
21171a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_add);}
212827bd09bSSatish Balay   else if (type == GL_B_XOR)
21371a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_xor);}
214827bd09bSSatish Balay   else if (type == GL_B_OR)
21571a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_or);}
216827bd09bSSatish Balay   else if (type == GL_B_AND)
21771a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_and);}
218827bd09bSSatish Balay   else if (type == GL_L_XOR)
21971a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_lxor);}
220827bd09bSSatish Balay   else if (type == GL_L_OR)
22171a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_lor);}
222827bd09bSSatish Balay   else if (type == GL_L_AND)
22371a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_land);}
224827bd09bSSatish Balay 
225827bd09bSSatish Balay   /* catch all ... not good if we get here */
226827bd09bSSatish Balay   return(NULL);
227827bd09bSSatish Balay }
228827bd09bSSatish Balay 
2297b1ae94cSBarry Smith /******************************************************************************/
23052f87cdaSBarry Smith PetscErrorCode ivec_sort( PetscInt *ar,  PetscInt size)
231827bd09bSSatish Balay {
23252f87cdaSBarry Smith    PetscInt *pi, *pj, temp;
23352f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **) offset_stack;
23452f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
235827bd09bSSatish Balay 
236827bd09bSSatish Balay 
237827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
238827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
239827bd09bSSatish Balay   size--;
240827bd09bSSatish Balay 
241827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
242827bd09bSSatish Balay   for (;;)
243827bd09bSSatish Balay     {
244827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
245827bd09bSSatish Balay       if (size > SORT_OPT)
246827bd09bSSatish Balay 	{
247827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
248827bd09bSSatish Balay 	  pi = ar+1;
249827bd09bSSatish Balay 	  pj = ar+size;
250827bd09bSSatish Balay 
251827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
252827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
253827bd09bSSatish Balay 
254827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
255827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
256827bd09bSSatish Balay 	  if (*pi > *pj)
257827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
258827bd09bSSatish Balay 	  if (*ar > *pj)
259827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
260827bd09bSSatish Balay 	  else if (*pi > *ar)
261827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
262827bd09bSSatish Balay 
263827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
264827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
265827bd09bSSatish Balay 	  for(;;)
266827bd09bSSatish Balay 	    {
267827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
268827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
269827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
270827bd09bSSatish Balay 
271827bd09bSSatish Balay 	      /* if we've crossed we're done */
272827bd09bSSatish Balay 	      if (pj<pi) break;
273827bd09bSSatish Balay 
274827bd09bSSatish Balay 	      /* else swap */
275827bd09bSSatish Balay 	      SWAP(*pi,*pj)
276827bd09bSSatish Balay 	    }
277827bd09bSSatish Balay 
278827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
279827bd09bSSatish Balay 	  SWAP(*ar,*pj)
280827bd09bSSatish Balay 
281827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
282*e7e72b3dSBarry Smith 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort() :: STACK EXHAUSTED!!!");
283827bd09bSSatish Balay 
284827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
28552f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
286827bd09bSSatish Balay 	    {
287827bd09bSSatish Balay 	      *(top_a++) = pi;
288827bd09bSSatish Balay 	      size -= *top_s+2;
289827bd09bSSatish Balay 	      top_s++;
290827bd09bSSatish Balay 	    }
291827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
292827bd09bSSatish Balay 	  else if (size -= *top_s+2)
293827bd09bSSatish Balay 	    {;}
294827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
295827bd09bSSatish Balay 	  else
296827bd09bSSatish Balay 	    {
297827bd09bSSatish Balay 	      ar = *(--top_a);
298827bd09bSSatish Balay 	      size = *(--top_s);
299827bd09bSSatish Balay 	    }
300827bd09bSSatish Balay 	}
301827bd09bSSatish Balay 
302827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
303827bd09bSSatish Balay       else
304827bd09bSSatish Balay 	{
305827bd09bSSatish Balay 	  /* insertion sort for bottom */
306827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
307827bd09bSSatish Balay             {
308827bd09bSSatish Balay               temp = *pj;
309827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
310827bd09bSSatish Balay                 {
311827bd09bSSatish Balay                   if (*pi <= temp) break;
312827bd09bSSatish Balay                   *(pi+1)=*pi;
313827bd09bSSatish Balay                 }
314827bd09bSSatish Balay               *(pi+1)=temp;
315827bd09bSSatish Balay 	    }
316827bd09bSSatish Balay 
317827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
3183fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
319827bd09bSSatish Balay 
320827bd09bSSatish Balay 	  /* else pop another list from the stack */
321827bd09bSSatish Balay 	  ar = *(--top_a);
322827bd09bSSatish Balay 	  size = *(--top_s);
323827bd09bSSatish Balay 	}
324827bd09bSSatish Balay     }
3253fdc5746SBarry Smith   PetscFunctionReturn(0);
326827bd09bSSatish Balay }
327827bd09bSSatish Balay 
3287b1ae94cSBarry Smith /******************************************************************************/
32952f87cdaSBarry Smith PetscErrorCode ivec_sort_companion( PetscInt *ar,  PetscInt *ar2,  PetscInt size)
330827bd09bSSatish Balay {
33152f87cdaSBarry Smith    PetscInt *pi, *pj, temp, temp2;
33252f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **)offset_stack;
33352f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
33452f87cdaSBarry Smith    PetscInt *pi2, *pj2;
33552f87cdaSBarry Smith    PetscInt mid;
336827bd09bSSatish Balay 
3373fdc5746SBarry Smith   PetscFunctionBegin;
338827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
339827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
340827bd09bSSatish Balay   size--;
341827bd09bSSatish Balay 
342827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
343827bd09bSSatish Balay   for (;;)
344827bd09bSSatish Balay     {
345827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
346827bd09bSSatish Balay       if (size > SORT_OPT)
347827bd09bSSatish Balay 	{
348827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
349827bd09bSSatish Balay 	  mid = size>>1;
350827bd09bSSatish Balay 	  pi = ar+1;
351827bd09bSSatish Balay 	  pj = ar+mid;
352827bd09bSSatish Balay 	  pi2 = ar2+1;
353827bd09bSSatish Balay 	  pj2 = ar2+mid;
354827bd09bSSatish Balay 
355827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
356827bd09bSSatish Balay 	  SWAP(*pi,*pj)
357827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
358827bd09bSSatish Balay 
359827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
360827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
361827bd09bSSatish Balay 	  pj = ar+size;
362827bd09bSSatish Balay 	  pj2 = ar2+size;
363827bd09bSSatish Balay 	  if (*pi > *pj)
364827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
365827bd09bSSatish Balay 	  if (*ar > *pj)
366827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
367827bd09bSSatish Balay 	  else if (*pi > *ar)
368827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
369827bd09bSSatish Balay 
370827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
371827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
372827bd09bSSatish Balay 	  for(;;)
373827bd09bSSatish Balay 	    {
374827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
375827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
376827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
377827bd09bSSatish Balay 
378827bd09bSSatish Balay 	      /* if we've crossed we're done */
379827bd09bSSatish Balay 	      if (pj<pi) break;
380827bd09bSSatish Balay 
381827bd09bSSatish Balay 	      /* else swap */
382827bd09bSSatish Balay 	      SWAP(*pi,*pj)
383827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
384827bd09bSSatish Balay 	    }
385827bd09bSSatish Balay 
386827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
387827bd09bSSatish Balay 	  SWAP(*ar,*pj)
388827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
389827bd09bSSatish Balay 
390827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
391*e7e72b3dSBarry Smith 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort_companion() :: STACK EXHAUSTED!!!");
392827bd09bSSatish Balay 
393827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
39452f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
395827bd09bSSatish Balay 	    {
396827bd09bSSatish Balay 	      *(top_a++) = pi;
397827bd09bSSatish Balay 	      *(top_a++) = pi2;
398827bd09bSSatish Balay 	      size -= *top_s+2;
399827bd09bSSatish Balay 	      top_s++;
400827bd09bSSatish Balay 	    }
401827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
402827bd09bSSatish Balay 	  else if (size -= *top_s+2)
403827bd09bSSatish Balay 	    {;}
404827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
405827bd09bSSatish Balay 	  else
406827bd09bSSatish Balay 	    {
407827bd09bSSatish Balay 	      ar2 = *(--top_a);
408827bd09bSSatish Balay 	      ar  = *(--top_a);
409827bd09bSSatish Balay 	      size = *(--top_s);
410827bd09bSSatish Balay 	    }
411827bd09bSSatish Balay 	}
412827bd09bSSatish Balay 
413827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
414827bd09bSSatish Balay       else
415827bd09bSSatish Balay 	{
416827bd09bSSatish Balay 	  /* insertion sort for bottom */
417827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
418827bd09bSSatish Balay             {
419827bd09bSSatish Balay               temp = *pj;
420827bd09bSSatish Balay               temp2 = *pj2;
421827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
422827bd09bSSatish Balay                 {
423827bd09bSSatish Balay                   if (*pi <= temp) break;
424827bd09bSSatish Balay                   *(pi+1)=*pi;
425827bd09bSSatish Balay                   *(pi2+1)=*pi2;
426827bd09bSSatish Balay                 }
427827bd09bSSatish Balay               *(pi+1)=temp;
428827bd09bSSatish Balay               *(pi2+1)=temp2;
429827bd09bSSatish Balay 	    }
430827bd09bSSatish Balay 
431827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
4323fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
433827bd09bSSatish Balay 
434827bd09bSSatish Balay 	  /* else pop another list from the stack */
435827bd09bSSatish Balay 	  ar2 = *(--top_a);
436827bd09bSSatish Balay 	  ar  = *(--top_a);
437827bd09bSSatish Balay 	  size = *(--top_s);
438827bd09bSSatish Balay 	}
439827bd09bSSatish Balay     }
4403fdc5746SBarry Smith   PetscFunctionReturn(0);
441827bd09bSSatish Balay }
442827bd09bSSatish Balay 
4437b1ae94cSBarry Smith /******************************************************************************/
44452f87cdaSBarry Smith PetscErrorCode ivec_sort_companion_hack( PetscInt *ar,  PetscInt **ar2, PetscInt size)
445827bd09bSSatish Balay {
44652f87cdaSBarry Smith    PetscInt *pi, *pj, temp, *ptr;
44752f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **)offset_stack;
44852f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
44952f87cdaSBarry Smith    PetscInt **pi2, **pj2;
45052f87cdaSBarry Smith    PetscInt mid;
451827bd09bSSatish Balay 
4523fdc5746SBarry Smith   PetscFunctionBegin;
453827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
454827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
455827bd09bSSatish Balay   size--;
456827bd09bSSatish Balay 
457827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
458827bd09bSSatish Balay   for (;;)
459827bd09bSSatish Balay     {
460827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
461827bd09bSSatish Balay       if (size > SORT_OPT)
462827bd09bSSatish Balay 	{
463827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
464827bd09bSSatish Balay 	  mid = size>>1;
465827bd09bSSatish Balay 	  pi = ar+1;
466827bd09bSSatish Balay 	  pj = ar+mid;
467827bd09bSSatish Balay 	  pi2 = ar2+1;
468827bd09bSSatish Balay 	  pj2 = ar2+mid;
469827bd09bSSatish Balay 
470827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
471827bd09bSSatish Balay 	  SWAP(*pi,*pj)
472827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
473827bd09bSSatish Balay 
474827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
475827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
476827bd09bSSatish Balay 	  pj = ar+size;
477827bd09bSSatish Balay 	  pj2 = ar2+size;
478827bd09bSSatish Balay 	  if (*pi > *pj)
479827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
480827bd09bSSatish Balay 	  if (*ar > *pj)
481827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
482827bd09bSSatish Balay 	  else if (*pi > *ar)
483827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
484827bd09bSSatish Balay 
485827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
486827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
487827bd09bSSatish Balay 	  for(;;)
488827bd09bSSatish Balay 	    {
489827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
490827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
491827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
492827bd09bSSatish Balay 
493827bd09bSSatish Balay 	      /* if we've crossed we're done */
494827bd09bSSatish Balay 	      if (pj<pi) break;
495827bd09bSSatish Balay 
496827bd09bSSatish Balay 	      /* else swap */
497827bd09bSSatish Balay 	      SWAP(*pi,*pj)
498827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
499827bd09bSSatish Balay 	    }
500827bd09bSSatish Balay 
501827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
502827bd09bSSatish Balay 	  SWAP(*ar,*pj)
503827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
504827bd09bSSatish Balay 
505827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
506*e7e72b3dSBarry Smith 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
507827bd09bSSatish Balay 
508827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
50952f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
510827bd09bSSatish Balay 	    {
511827bd09bSSatish Balay 	      *(top_a++) = pi;
51252f87cdaSBarry Smith 	      *(top_a++) = (PetscInt*) pi2;
513827bd09bSSatish Balay 	      size -= *top_s+2;
514827bd09bSSatish Balay 	      top_s++;
515827bd09bSSatish Balay 	    }
516827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
517827bd09bSSatish Balay 	  else if (size -= *top_s+2)
518827bd09bSSatish Balay 	    {;}
519827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
520827bd09bSSatish Balay 	  else
521827bd09bSSatish Balay 	    {
52252f87cdaSBarry Smith 	      ar2 = (PetscInt **) *(--top_a);
523827bd09bSSatish Balay 	      ar  = *(--top_a);
524827bd09bSSatish Balay 	      size = *(--top_s);
525827bd09bSSatish Balay 	    }
526827bd09bSSatish Balay 	}
527827bd09bSSatish Balay 
528827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
529827bd09bSSatish Balay       else
530827bd09bSSatish Balay 	{
531827bd09bSSatish Balay 	  /* insertion sort for bottom */
532827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
533827bd09bSSatish Balay             {
534827bd09bSSatish Balay               temp = *pj;
535827bd09bSSatish Balay               ptr = *pj2;
536827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
537827bd09bSSatish Balay                 {
538827bd09bSSatish Balay                   if (*pi <= temp) break;
539827bd09bSSatish Balay                   *(pi+1)=*pi;
540827bd09bSSatish Balay                   *(pi2+1)=*pi2;
541827bd09bSSatish Balay                 }
542827bd09bSSatish Balay               *(pi+1)=temp;
543827bd09bSSatish Balay               *(pi2+1)=ptr;
544827bd09bSSatish Balay 	    }
545827bd09bSSatish Balay 
546827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
5473fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
548827bd09bSSatish Balay 
549827bd09bSSatish Balay 	  /* else pop another list from the stack */
55052f87cdaSBarry Smith 	  ar2 = (PetscInt **)*(--top_a);
551827bd09bSSatish Balay 	  ar  = *(--top_a);
552827bd09bSSatish Balay 	  size = *(--top_s);
553827bd09bSSatish Balay 	}
554827bd09bSSatish Balay     }
5553fdc5746SBarry Smith   PetscFunctionReturn(0);
556827bd09bSSatish Balay }
557827bd09bSSatish Balay 
5587b1ae94cSBarry Smith /******************************************************************************/
55952f87cdaSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
560827bd09bSSatish Balay {
5613fdc5746SBarry Smith   PetscFunctionBegin;
562*e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
563*e7e72b3dSBarry Smith     if (ar2) ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size);
564*e7e72b3dSBarry Smith     else ivec_sort((PetscInt*)ar1,size);
565*e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
566*e7e72b3dSBarry Smith     if (ar2) ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt **)ar2,size);
567*e7e72b3dSBarry Smith     else ivec_sort((PetscInt*)ar1,size);
568*e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SMI_sort only does SORT_INTEGER!");
5693fdc5746SBarry Smith   PetscFunctionReturn(0);
570827bd09bSSatish Balay }
571827bd09bSSatish Balay 
5727b1ae94cSBarry Smith /***********************************ivec.c*************************************/
57352f87cdaSBarry Smith PetscInt ivec_linear_search( PetscInt item,  PetscInt *list,  PetscInt n)
574827bd09bSSatish Balay {
57552f87cdaSBarry Smith   PetscInt tmp = n-1;
5763fdc5746SBarry Smith   PetscFunctionBegin;
577827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
578827bd09bSSatish Balay   return(-1);
579827bd09bSSatish Balay }
580827bd09bSSatish Balay 
5817b1ae94cSBarry Smith /***********************************ivec.c*************************************/
58252f87cdaSBarry Smith PetscInt ivec_binary_search( PetscInt item,  PetscInt *list,  PetscInt rh)
583827bd09bSSatish Balay {
58452f87cdaSBarry Smith    PetscInt mid, lh=0;
585827bd09bSSatish Balay 
586827bd09bSSatish Balay   rh--;
587827bd09bSSatish Balay   while (lh<=rh)
588827bd09bSSatish Balay     {
589827bd09bSSatish Balay       mid = (lh+rh)>>1;
590827bd09bSSatish Balay       if (*(list+mid) == item)
591827bd09bSSatish Balay 	{return(mid);}
592827bd09bSSatish Balay       if (*(list+mid) > item)
593827bd09bSSatish Balay 	{rh = mid-1;}
594827bd09bSSatish Balay       else
595827bd09bSSatish Balay 	{lh = mid+1;}
596827bd09bSSatish Balay     }
597827bd09bSSatish Balay   return(-1);
598827bd09bSSatish Balay }
599827bd09bSSatish Balay 
6007b1ae94cSBarry Smith /*********************************ivec.c*************************************/
60152f87cdaSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
602827bd09bSSatish Balay {
6033fdc5746SBarry Smith   PetscFunctionBegin;
604827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
6053fdc5746SBarry Smith   PetscFunctionReturn(0);
606827bd09bSSatish Balay }
607827bd09bSSatish Balay 
6087b1ae94cSBarry Smith /*********************************ivec.c*************************************/
60952f87cdaSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1,  PetscInt n)
610827bd09bSSatish Balay {
6113fdc5746SBarry Smith   PetscFunctionBegin;
612827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
6133fdc5746SBarry Smith   PetscFunctionReturn(0);
614827bd09bSSatish Balay }
615827bd09bSSatish Balay 
6167b1ae94cSBarry Smith /***********************************ivec.c*************************************/
61752f87cdaSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1,  PetscInt n)
618827bd09bSSatish Balay {
6193fdc5746SBarry Smith   PetscFunctionBegin;
620827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
6213fdc5746SBarry Smith   PetscFunctionReturn(0);
622827bd09bSSatish Balay }
623827bd09bSSatish Balay 
6247b1ae94cSBarry Smith /***********************************ivec.c*************************************/
62552f87cdaSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
626827bd09bSSatish Balay {
6273fdc5746SBarry Smith   PetscFunctionBegin;
628827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
6293fdc5746SBarry Smith   PetscFunctionReturn(0);
630827bd09bSSatish Balay }
631827bd09bSSatish Balay 
6327b1ae94cSBarry Smith /***********************************ivec.c*************************************/
63352f87cdaSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
634827bd09bSSatish Balay {
6353fdc5746SBarry Smith   PetscFunctionBegin;
636827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
6373fdc5746SBarry Smith   PetscFunctionReturn(0);
638827bd09bSSatish Balay }
639827bd09bSSatish Balay 
6407b1ae94cSBarry Smith /*********************************ivec.c*************************************/
64152f87cdaSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
642827bd09bSSatish Balay {
6433fdc5746SBarry Smith   PetscFunctionBegin;
644827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
6453fdc5746SBarry Smith   PetscFunctionReturn(0);
646827bd09bSSatish Balay }
647827bd09bSSatish Balay 
6487b1ae94cSBarry Smith /*********************************ivec.c*************************************/
64952f87cdaSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
650827bd09bSSatish Balay {
6513fdc5746SBarry Smith   PetscFunctionBegin;
652827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
6533fdc5746SBarry Smith   PetscFunctionReturn(0);
654827bd09bSSatish Balay }
655827bd09bSSatish Balay 
6567b1ae94cSBarry Smith /*********************************ivec.c*************************************/
65752f87cdaSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
658827bd09bSSatish Balay {
6593fdc5746SBarry Smith   PetscFunctionBegin;
66039945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
6613fdc5746SBarry Smith   PetscFunctionReturn(0);
662827bd09bSSatish Balay }
663827bd09bSSatish Balay 
6647b1ae94cSBarry Smith /*********************************ivec.c*************************************/
66552f87cdaSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
666827bd09bSSatish Balay {
6673fdc5746SBarry Smith   PetscFunctionBegin;
668827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
6693fdc5746SBarry Smith   PetscFunctionReturn(0);
670827bd09bSSatish Balay }
671827bd09bSSatish Balay 
6727b1ae94cSBarry Smith /*********************************ivec.c*************************************/
67352f87cdaSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
674827bd09bSSatish Balay {
6753fdc5746SBarry Smith   PetscFunctionBegin;
67639945688SSatish Balay   while (n--)  {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;}
6773fdc5746SBarry Smith   PetscFunctionReturn(0);
678827bd09bSSatish Balay }
679827bd09bSSatish Balay 
6807b1ae94cSBarry Smith /*********************************ivec.c*************************************/
68152f87cdaSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
682827bd09bSSatish Balay {
6833fdc5746SBarry Smith   PetscFunctionBegin;
684827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
6853fdc5746SBarry Smith   PetscFunctionReturn(0);
686827bd09bSSatish Balay }
687827bd09bSSatish Balay 
6887b1ae94cSBarry Smith /*********************************ivec.c*************************************/
68952f87cdaSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
690827bd09bSSatish Balay {
6913fdc5746SBarry Smith   PetscFunctionBegin;
692827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
6933fdc5746SBarry Smith   PetscFunctionReturn(0);
694827bd09bSSatish Balay }
695827bd09bSSatish Balay 
6967b1ae94cSBarry Smith /***********************************ivec.c*************************************/
69752f87cdaSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  PetscInt n,  PetscInt *arg3)
698827bd09bSSatish Balay {
69952f87cdaSBarry Smith    PetscInt i, j, type;
700827bd09bSSatish Balay 
7013fdc5746SBarry Smith   PetscFunctionBegin;
702827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
703827bd09bSSatish Balay   for (i=0;i<n;)
704827bd09bSSatish Balay     {
705827bd09bSSatish Balay       /* clump 'em for now */
706827bd09bSSatish Balay       j=i+1;
707827bd09bSSatish Balay       type = arg3[i];
708827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
709827bd09bSSatish Balay 	{j++;}
710827bd09bSSatish Balay 
711827bd09bSSatish Balay       /* how many together */
712827bd09bSSatish Balay       j -= i;
713827bd09bSSatish Balay 
714827bd09bSSatish Balay       /* call appropriate ivec function */
715827bd09bSSatish Balay       if (type == GL_MAX)
716827bd09bSSatish Balay 	{rvec_max(arg1,arg2,j);}
717827bd09bSSatish Balay       else if (type == GL_MIN)
718827bd09bSSatish Balay 	{rvec_min(arg1,arg2,j);}
719827bd09bSSatish Balay       else if (type == GL_MULT)
720827bd09bSSatish Balay 	{rvec_mult(arg1,arg2,j);}
721827bd09bSSatish Balay       else if (type == GL_ADD)
722827bd09bSSatish Balay 	{rvec_add(arg1,arg2,j);}
723827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
724827bd09bSSatish Balay 	{rvec_max_abs(arg1,arg2,j);}
725827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
726827bd09bSSatish Balay 	{rvec_min_abs(arg1,arg2,j);}
727827bd09bSSatish Balay       else if (type == GL_EXISTS)
728827bd09bSSatish Balay 	{rvec_exists(arg1,arg2,j);}
729*e7e72b3dSBarry Smith       else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to rvec_non_uniform()!");
730827bd09bSSatish Balay 
731827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
732827bd09bSSatish Balay     }
7333fdc5746SBarry Smith   PetscFunctionReturn(0);
734827bd09bSSatish Balay }
735827bd09bSSatish Balay 
7367b1ae94cSBarry Smith /***********************************ivec.c*************************************/
73752f87cdaSBarry Smith vfp rvec_fct_addr( PetscInt type)
738827bd09bSSatish Balay {
739827bd09bSSatish Balay   if (type == NON_UNIFORM)
74071a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_non_uniform);}
741827bd09bSSatish Balay   else if (type == GL_MAX)
74271a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_max);}
743827bd09bSSatish Balay   else if (type == GL_MIN)
74471a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_min);}
745827bd09bSSatish Balay   else if (type == GL_MULT)
74671a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_mult);}
747827bd09bSSatish Balay   else if (type == GL_ADD)
74871a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_add);}
749827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
75071a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_max_abs);}
751827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
75271a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_min_abs);}
753827bd09bSSatish Balay   else if (type == GL_EXISTS)
75471a0148aSBarry Smith     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_exists);}
755827bd09bSSatish Balay 
756827bd09bSSatish Balay   /* catch all ... not good if we get here */
757827bd09bSSatish Balay   return(NULL);
758827bd09bSSatish Balay }
759827bd09bSSatish Balay 
760827bd09bSSatish Balay 
761827bd09bSSatish Balay 
762827bd09bSSatish Balay 
763827bd09bSSatish Balay 
764827bd09bSSatish Balay 
765