xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision ca8e9878d215fbd0d6b1ef802734bc6b1f5fa99c)
1827bd09bSSatish Balay 
2827bd09bSSatish Balay /**********************************ivec.c**************************************
3827bd09bSSatish Balay 
4827bd09bSSatish Balay Author: Henry M. Tufo III
5827bd09bSSatish Balay 
6827bd09bSSatish Balay e-mail: hmt@cs.brown.edu
7827bd09bSSatish Balay 
8827bd09bSSatish Balay snail-mail:
9827bd09bSSatish Balay Division of Applied Mathematics
10827bd09bSSatish Balay Brown University
11827bd09bSSatish Balay Providence, RI 02912
12827bd09bSSatish Balay 
13827bd09bSSatish Balay Last Modification:
14827bd09bSSatish Balay 6.21.97
15827bd09bSSatish Balay ***********************************ivec.c*************************************/
16827bd09bSSatish Balay 
17c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h>
18827bd09bSSatish Balay 
19827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */
20827bd09bSSatish Balay #define   SORT_OPT	6
21827bd09bSSatish Balay #define   SORT_STACK	50000
22827bd09bSSatish Balay 
23827bd09bSSatish Balay 
24827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */
25827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK];
2652f87cdaSBarry Smith static PetscInt   size_stack[SORT_STACK];
27827bd09bSSatish Balay 
287b1ae94cSBarry Smith /***********************************ivec.c*************************************/
29*ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
30827bd09bSSatish Balay {
31827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
32827bd09bSSatish Balay   return(arg1);
33827bd09bSSatish Balay }
34827bd09bSSatish Balay 
357b1ae94cSBarry Smith /***********************************ivec.c*************************************/
36*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero( PetscInt *arg1,  PetscInt n)
37827bd09bSSatish Balay {
383fdc5746SBarry Smith   PetscFunctionBegin;
39827bd09bSSatish Balay   while (n--)  {*arg1++ = 0;}
403fdc5746SBarry Smith   PetscFunctionReturn(0);
41827bd09bSSatish Balay }
42827bd09bSSatish Balay 
437b1ae94cSBarry Smith /***********************************ivec.c*************************************/
44*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set( PetscInt *arg1,  PetscInt arg2,  PetscInt n)
45827bd09bSSatish Balay {
463fdc5746SBarry Smith   PetscFunctionBegin;
47827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
483fdc5746SBarry Smith   PetscFunctionReturn(0);
49827bd09bSSatish Balay }
50827bd09bSSatish Balay 
517b1ae94cSBarry Smith /***********************************ivec.c*************************************/
52*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_max( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
53827bd09bSSatish Balay {
543fdc5746SBarry Smith   PetscFunctionBegin;
5539945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
563fdc5746SBarry Smith   PetscFunctionReturn(0);
57827bd09bSSatish Balay }
58827bd09bSSatish Balay 
597b1ae94cSBarry Smith /***********************************ivec.c*************************************/
60*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
61827bd09bSSatish Balay {
623fdc5746SBarry Smith   PetscFunctionBegin;
6339945688SSatish Balay   while (n--)  {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;}
643fdc5746SBarry Smith   PetscFunctionReturn(0);
65827bd09bSSatish Balay }
66827bd09bSSatish Balay 
677b1ae94cSBarry Smith /***********************************ivec.c*************************************/
68*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
69827bd09bSSatish Balay {
703fdc5746SBarry Smith   PetscFunctionBegin;
71827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
723fdc5746SBarry Smith   PetscFunctionReturn(0);
73827bd09bSSatish Balay }
74827bd09bSSatish Balay 
757b1ae94cSBarry Smith /***********************************ivec.c*************************************/
76*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
77827bd09bSSatish Balay {
783fdc5746SBarry Smith   PetscFunctionBegin;
79827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
803fdc5746SBarry Smith   PetscFunctionReturn(0);
81827bd09bSSatish Balay }
82827bd09bSSatish Balay 
837b1ae94cSBarry Smith /***********************************ivec.c*************************************/
84*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
85827bd09bSSatish Balay {
863fdc5746SBarry Smith   PetscFunctionBegin;
87827bd09bSSatish Balay   while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;}
883fdc5746SBarry Smith   PetscFunctionReturn(0);
89827bd09bSSatish Balay }
90827bd09bSSatish Balay 
917b1ae94cSBarry Smith /***********************************ivec.c*************************************/
92*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
93827bd09bSSatish Balay {
943fdc5746SBarry Smith   PetscFunctionBegin;
95827bd09bSSatish Balay   while (n--)  {*arg1++ ^= *arg2++;}
963fdc5746SBarry Smith   PetscFunctionReturn(0);
97827bd09bSSatish Balay }
98827bd09bSSatish Balay 
997b1ae94cSBarry Smith /***********************************ivec.c*************************************/
100*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
101827bd09bSSatish Balay {
1023fdc5746SBarry Smith   PetscFunctionBegin;
103827bd09bSSatish Balay   while (n--)  {*arg1++ |= *arg2++;}
1043fdc5746SBarry Smith   PetscFunctionReturn(0);
105827bd09bSSatish Balay }
106827bd09bSSatish Balay 
1077b1ae94cSBarry Smith /***********************************ivec.c*************************************/
108*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
109827bd09bSSatish Balay {
1103fdc5746SBarry Smith   PetscFunctionBegin;
111827bd09bSSatish Balay   while (n--)  {*arg1 = (*arg1 || *arg2); arg1++; arg2++;}
1123fdc5746SBarry Smith   PetscFunctionReturn(0);
113827bd09bSSatish Balay }
114827bd09bSSatish Balay 
1157b1ae94cSBarry Smith /***********************************ivec.c*************************************/
116*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
117827bd09bSSatish Balay {
1183fdc5746SBarry Smith   PetscFunctionBegin;
119827bd09bSSatish Balay   while (n--)  {*arg1++ &= *arg2++;}
1203fdc5746SBarry Smith   PetscFunctionReturn(0);
121827bd09bSSatish Balay }
122827bd09bSSatish Balay 
1237b1ae94cSBarry Smith /***********************************ivec.c*************************************/
124*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land( PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
125827bd09bSSatish Balay {
1263fdc5746SBarry Smith   PetscFunctionBegin;
127827bd09bSSatish Balay   while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;}
1283fdc5746SBarry Smith   PetscFunctionReturn(0);
129827bd09bSSatish Balay }
130827bd09bSSatish Balay 
1317b1ae94cSBarry Smith /***********************************ivec.c*************************************/
132*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3( PetscInt *arg1,  PetscInt *arg2,  PetscInt *arg3, PetscInt n)
133827bd09bSSatish Balay {
1343fdc5746SBarry Smith   PetscFunctionBegin;
135827bd09bSSatish Balay   while (n--)  {*arg1++ = (*arg2++ & *arg3++);}
1363fdc5746SBarry Smith   PetscFunctionReturn(0);
137827bd09bSSatish Balay }
138827bd09bSSatish Balay 
1397b1ae94cSBarry Smith /***********************************ivec.c*************************************/
140*ca8e9878SJed Brown PetscInt PCTFS_ivec_sum( PetscInt *arg1,  PetscInt n)
141827bd09bSSatish Balay {
14252f87cdaSBarry Smith    PetscInt tmp = 0;
143827bd09bSSatish Balay 
144827bd09bSSatish Balay 
145827bd09bSSatish Balay   while (n--) {tmp += *arg1++;}
146827bd09bSSatish Balay   return(tmp);
147827bd09bSSatish Balay }
148827bd09bSSatish Balay 
1497b1ae94cSBarry Smith /***********************************ivec.c*************************************/
150*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2,  PetscInt n,  PetscInt *arg3)
151827bd09bSSatish Balay {
15252f87cdaSBarry Smith    PetscInt i, j, type;
153827bd09bSSatish Balay 
154827bd09bSSatish Balay 
1553fdc5746SBarry Smith   PetscFunctionBegin;
156827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
157827bd09bSSatish Balay   for (i=0;i<n;)
158827bd09bSSatish Balay     {
159827bd09bSSatish Balay       /* clump 'em for now */
160827bd09bSSatish Balay       j=i+1;
161827bd09bSSatish Balay       type = arg3[i];
162827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
163827bd09bSSatish Balay 	{j++;}
164827bd09bSSatish Balay 
165827bd09bSSatish Balay       /* how many together */
166827bd09bSSatish Balay       j -= i;
167827bd09bSSatish Balay 
168827bd09bSSatish Balay       /* call appropriate ivec function */
169827bd09bSSatish Balay       if (type == GL_MAX)
170*ca8e9878SJed Brown 	{PCTFS_ivec_max(arg1,arg2,j);}
171827bd09bSSatish Balay       else if (type == GL_MIN)
172*ca8e9878SJed Brown 	{PCTFS_ivec_min(arg1,arg2,j);}
173827bd09bSSatish Balay       else if (type == GL_MULT)
174*ca8e9878SJed Brown 	{PCTFS_ivec_mult(arg1,arg2,j);}
175827bd09bSSatish Balay       else if (type == GL_ADD)
176*ca8e9878SJed Brown 	{PCTFS_ivec_add(arg1,arg2,j);}
177827bd09bSSatish Balay       else if (type == GL_B_XOR)
178*ca8e9878SJed Brown 	{PCTFS_ivec_xor(arg1,arg2,j);}
179827bd09bSSatish Balay       else if (type == GL_B_OR)
180*ca8e9878SJed Brown 	{PCTFS_ivec_or(arg1,arg2,j);}
181827bd09bSSatish Balay       else if (type == GL_B_AND)
182*ca8e9878SJed Brown 	{PCTFS_ivec_and(arg1,arg2,j);}
183827bd09bSSatish Balay       else if (type == GL_L_XOR)
184*ca8e9878SJed Brown 	{PCTFS_ivec_lxor(arg1,arg2,j);}
185827bd09bSSatish Balay       else if (type == GL_L_OR)
186*ca8e9878SJed Brown 	{PCTFS_ivec_lor(arg1,arg2,j);}
187827bd09bSSatish Balay       else if (type == GL_L_AND)
188*ca8e9878SJed Brown 	{PCTFS_ivec_land(arg1,arg2,j);}
189827bd09bSSatish Balay       else
190*ca8e9878SJed Brown 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_ivec_non_uniform()!");
191827bd09bSSatish Balay 
192827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
193827bd09bSSatish Balay     }
1943fdc5746SBarry Smith   PetscFunctionReturn(0);
195827bd09bSSatish Balay }
196827bd09bSSatish Balay 
1977b1ae94cSBarry Smith /***********************************ivec.c*************************************/
198*ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr( PetscInt type)
199827bd09bSSatish Balay {
2003fdc5746SBarry Smith   PetscFunctionBegin;
201827bd09bSSatish Balay   if (type == NON_UNIFORM)
202*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_non_uniform);}
203827bd09bSSatish Balay   else if (type == GL_MAX)
204*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_max);}
205827bd09bSSatish Balay   else if (type == GL_MIN)
206*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_min);}
207827bd09bSSatish Balay   else if (type == GL_MULT)
208*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_mult);}
209827bd09bSSatish Balay   else if (type == GL_ADD)
210*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_add);}
211827bd09bSSatish Balay   else if (type == GL_B_XOR)
212*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_xor);}
213827bd09bSSatish Balay   else if (type == GL_B_OR)
214*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_or);}
215827bd09bSSatish Balay   else if (type == GL_B_AND)
216*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_and);}
217827bd09bSSatish Balay   else if (type == GL_L_XOR)
218*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_lxor);}
219827bd09bSSatish Balay   else if (type == GL_L_OR)
220*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_lor);}
221827bd09bSSatish Balay   else if (type == GL_L_AND)
222*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_land);}
223827bd09bSSatish Balay 
224827bd09bSSatish Balay   /* catch all ... not good if we get here */
225827bd09bSSatish Balay   return(NULL);
226827bd09bSSatish Balay }
227827bd09bSSatish Balay 
2287b1ae94cSBarry Smith /******************************************************************************/
229*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort( PetscInt *ar,  PetscInt size)
230827bd09bSSatish Balay {
23152f87cdaSBarry Smith    PetscInt *pi, *pj, temp;
23252f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **) offset_stack;
23352f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
234827bd09bSSatish Balay 
235827bd09bSSatish Balay 
236827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
237827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
238827bd09bSSatish Balay   size--;
239827bd09bSSatish Balay 
240827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
241827bd09bSSatish Balay   for (;;)
242827bd09bSSatish Balay     {
243827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
244827bd09bSSatish Balay       if (size > SORT_OPT)
245827bd09bSSatish Balay 	{
246827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
247827bd09bSSatish Balay 	  pi = ar+1;
248827bd09bSSatish Balay 	  pj = ar+size;
249827bd09bSSatish Balay 
250827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
251827bd09bSSatish Balay 	  SWAP(*(ar+(size>>1)),*pi)
252827bd09bSSatish Balay 
253827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
254827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
255827bd09bSSatish Balay 	  if (*pi > *pj)
256827bd09bSSatish Balay 	    {SWAP(*pi,*pj)}
257827bd09bSSatish Balay 	  if (*ar > *pj)
258827bd09bSSatish Balay 	    {SWAP(*ar,*pj)}
259827bd09bSSatish Balay 	  else if (*pi > *ar)
260827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1))}
261827bd09bSSatish Balay 
262827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
263827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
264827bd09bSSatish Balay 	  for(;;)
265827bd09bSSatish Balay 	    {
266827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
267827bd09bSSatish Balay 	      do pi++; while (*pi<*ar);
268827bd09bSSatish Balay 	      do pj--; while (*pj>*ar);
269827bd09bSSatish Balay 
270827bd09bSSatish Balay 	      /* if we've crossed we're done */
271827bd09bSSatish Balay 	      if (pj<pi) break;
272827bd09bSSatish Balay 
273827bd09bSSatish Balay 	      /* else swap */
274827bd09bSSatish Balay 	      SWAP(*pi,*pj)
275827bd09bSSatish Balay 	    }
276827bd09bSSatish Balay 
277827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
278827bd09bSSatish Balay 	  SWAP(*ar,*pj)
279827bd09bSSatish Balay 
280827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
281*ca8e9878SJed Brown 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!");
282827bd09bSSatish Balay 
283827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
28452f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
285827bd09bSSatish Balay 	    {
286827bd09bSSatish Balay 	      *(top_a++) = pi;
287827bd09bSSatish Balay 	      size -= *top_s+2;
288827bd09bSSatish Balay 	      top_s++;
289827bd09bSSatish Balay 	    }
290827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
291827bd09bSSatish Balay 	  else if (size -= *top_s+2)
292827bd09bSSatish Balay 	    {;}
293827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
294827bd09bSSatish Balay 	  else
295827bd09bSSatish Balay 	    {
296827bd09bSSatish Balay 	      ar = *(--top_a);
297827bd09bSSatish Balay 	      size = *(--top_s);
298827bd09bSSatish Balay 	    }
299827bd09bSSatish Balay 	}
300827bd09bSSatish Balay 
301827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
302827bd09bSSatish Balay       else
303827bd09bSSatish Balay 	{
304827bd09bSSatish Balay 	  /* insertion sort for bottom */
305827bd09bSSatish Balay           for (pj=ar+1;pj<=ar+size;pj++)
306827bd09bSSatish Balay             {
307827bd09bSSatish Balay               temp = *pj;
308827bd09bSSatish Balay               for (pi=pj-1;pi>=ar;pi--)
309827bd09bSSatish Balay                 {
310827bd09bSSatish Balay                   if (*pi <= temp) break;
311827bd09bSSatish Balay                   *(pi+1)=*pi;
312827bd09bSSatish Balay                 }
313827bd09bSSatish Balay               *(pi+1)=temp;
314827bd09bSSatish Balay 	    }
315827bd09bSSatish Balay 
316827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
3173fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
318827bd09bSSatish Balay 
319827bd09bSSatish Balay 	  /* else pop another list from the stack */
320827bd09bSSatish Balay 	  ar = *(--top_a);
321827bd09bSSatish Balay 	  size = *(--top_s);
322827bd09bSSatish Balay 	}
323827bd09bSSatish Balay     }
3243fdc5746SBarry Smith   PetscFunctionReturn(0);
325827bd09bSSatish Balay }
326827bd09bSSatish Balay 
3277b1ae94cSBarry Smith /******************************************************************************/
328*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion( PetscInt *ar,  PetscInt *ar2,  PetscInt size)
329827bd09bSSatish Balay {
33052f87cdaSBarry Smith    PetscInt *pi, *pj, temp, temp2;
33152f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **)offset_stack;
33252f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
33352f87cdaSBarry Smith    PetscInt *pi2, *pj2;
33452f87cdaSBarry Smith    PetscInt mid;
335827bd09bSSatish Balay 
3363fdc5746SBarry Smith   PetscFunctionBegin;
337827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
338827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
339827bd09bSSatish Balay   size--;
340827bd09bSSatish Balay 
341827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
342827bd09bSSatish Balay   for (;;)
343827bd09bSSatish Balay     {
344827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
345827bd09bSSatish Balay       if (size > SORT_OPT)
346827bd09bSSatish Balay 	{
347827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
348827bd09bSSatish Balay 	  mid = size>>1;
349827bd09bSSatish Balay 	  pi = ar+1;
350827bd09bSSatish Balay 	  pj = ar+mid;
351827bd09bSSatish Balay 	  pi2 = ar2+1;
352827bd09bSSatish Balay 	  pj2 = ar2+mid;
353827bd09bSSatish Balay 
354827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
355827bd09bSSatish Balay 	  SWAP(*pi,*pj)
356827bd09bSSatish Balay 	  SWAP(*pi2,*pj2)
357827bd09bSSatish Balay 
358827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
359827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
360827bd09bSSatish Balay 	  pj = ar+size;
361827bd09bSSatish Balay 	  pj2 = ar2+size;
362827bd09bSSatish Balay 	  if (*pi > *pj)
363827bd09bSSatish Balay 	    {SWAP(*pi,*pj) SWAP(*pi2,*pj2)}
364827bd09bSSatish Balay 	  if (*ar > *pj)
365827bd09bSSatish Balay 	    {SWAP(*ar,*pj) SWAP(*ar2,*pj2)}
366827bd09bSSatish Balay 	  else if (*pi > *ar)
367827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))}
368827bd09bSSatish Balay 
369827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
370827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
371827bd09bSSatish Balay 	  for(;;)
372827bd09bSSatish Balay 	    {
373827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
374827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
375827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
376827bd09bSSatish Balay 
377827bd09bSSatish Balay 	      /* if we've crossed we're done */
378827bd09bSSatish Balay 	      if (pj<pi) break;
379827bd09bSSatish Balay 
380827bd09bSSatish Balay 	      /* else swap */
381827bd09bSSatish Balay 	      SWAP(*pi,*pj)
382827bd09bSSatish Balay 	      SWAP(*pi2,*pj2)
383827bd09bSSatish Balay 	    }
384827bd09bSSatish Balay 
385827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
386827bd09bSSatish Balay 	  SWAP(*ar,*pj)
387827bd09bSSatish Balay 	  SWAP(*ar2,*pj2)
388827bd09bSSatish Balay 
389827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
390*ca8e9878SJed Brown 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!");
391827bd09bSSatish Balay 
392827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
39352f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
394827bd09bSSatish Balay 	    {
395827bd09bSSatish Balay 	      *(top_a++) = pi;
396827bd09bSSatish Balay 	      *(top_a++) = pi2;
397827bd09bSSatish Balay 	      size -= *top_s+2;
398827bd09bSSatish Balay 	      top_s++;
399827bd09bSSatish Balay 	    }
400827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
401827bd09bSSatish Balay 	  else if (size -= *top_s+2)
402827bd09bSSatish Balay 	    {;}
403827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
404827bd09bSSatish Balay 	  else
405827bd09bSSatish Balay 	    {
406827bd09bSSatish Balay 	      ar2 = *(--top_a);
407827bd09bSSatish Balay 	      ar  = *(--top_a);
408827bd09bSSatish Balay 	      size = *(--top_s);
409827bd09bSSatish Balay 	    }
410827bd09bSSatish Balay 	}
411827bd09bSSatish Balay 
412827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
413827bd09bSSatish Balay       else
414827bd09bSSatish Balay 	{
415827bd09bSSatish Balay 	  /* insertion sort for bottom */
416827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
417827bd09bSSatish Balay             {
418827bd09bSSatish Balay               temp = *pj;
419827bd09bSSatish Balay               temp2 = *pj2;
420827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
421827bd09bSSatish Balay                 {
422827bd09bSSatish Balay                   if (*pi <= temp) break;
423827bd09bSSatish Balay                   *(pi+1)=*pi;
424827bd09bSSatish Balay                   *(pi2+1)=*pi2;
425827bd09bSSatish Balay                 }
426827bd09bSSatish Balay               *(pi+1)=temp;
427827bd09bSSatish Balay               *(pi2+1)=temp2;
428827bd09bSSatish Balay 	    }
429827bd09bSSatish Balay 
430827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
4313fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
432827bd09bSSatish Balay 
433827bd09bSSatish Balay 	  /* else pop another list from the stack */
434827bd09bSSatish Balay 	  ar2 = *(--top_a);
435827bd09bSSatish Balay 	  ar  = *(--top_a);
436827bd09bSSatish Balay 	  size = *(--top_s);
437827bd09bSSatish Balay 	}
438827bd09bSSatish Balay     }
4393fdc5746SBarry Smith   PetscFunctionReturn(0);
440827bd09bSSatish Balay }
441827bd09bSSatish Balay 
4427b1ae94cSBarry Smith /******************************************************************************/
443*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack( PetscInt *ar,  PetscInt **ar2, PetscInt size)
444827bd09bSSatish Balay {
44552f87cdaSBarry Smith    PetscInt *pi, *pj, temp, *ptr;
44652f87cdaSBarry Smith    PetscInt **top_a = (PetscInt **)offset_stack;
44752f87cdaSBarry Smith    PetscInt *top_s = size_stack, *bottom_s = size_stack;
44852f87cdaSBarry Smith    PetscInt **pi2, **pj2;
44952f87cdaSBarry Smith    PetscInt mid;
450827bd09bSSatish Balay 
4513fdc5746SBarry Smith   PetscFunctionBegin;
452827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
453827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
454827bd09bSSatish Balay   size--;
455827bd09bSSatish Balay 
456827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
457827bd09bSSatish Balay   for (;;)
458827bd09bSSatish Balay     {
459827bd09bSSatish Balay       /* if list is large enough use quicksort partition exchange code */
460827bd09bSSatish Balay       if (size > SORT_OPT)
461827bd09bSSatish Balay 	{
462827bd09bSSatish Balay 	  /* start up pointer at element 1 and down at size     */
463827bd09bSSatish Balay 	  mid = size>>1;
464827bd09bSSatish Balay 	  pi = ar+1;
465827bd09bSSatish Balay 	  pj = ar+mid;
466827bd09bSSatish Balay 	  pi2 = ar2+1;
467827bd09bSSatish Balay 	  pj2 = ar2+mid;
468827bd09bSSatish Balay 
469827bd09bSSatish Balay 	  /* find middle element in list and swap w/ element 1 */
470827bd09bSSatish Balay 	  SWAP(*pi,*pj)
471827bd09bSSatish Balay 	  P_SWAP(*pi2,*pj2)
472827bd09bSSatish Balay 
473827bd09bSSatish Balay 	  /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
474827bd09bSSatish Balay 	  /* note ==> pivot_value in index 0                   */
475827bd09bSSatish Balay 	  pj = ar+size;
476827bd09bSSatish Balay 	  pj2 = ar2+size;
477827bd09bSSatish Balay 	  if (*pi > *pj)
478827bd09bSSatish Balay 	    {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)}
479827bd09bSSatish Balay 	  if (*ar > *pj)
480827bd09bSSatish Balay 	    {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)}
481827bd09bSSatish Balay 	  else if (*pi > *ar)
482827bd09bSSatish Balay 	    {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))}
483827bd09bSSatish Balay 
484827bd09bSSatish Balay 	  /* partition about pivot_value ...  	                    */
485827bd09bSSatish Balay 	  /* note lists of length 2 are not guaranteed to be sorted */
486827bd09bSSatish Balay 	  for(;;)
487827bd09bSSatish Balay 	    {
488827bd09bSSatish Balay 	      /* walk up ... and down ... swap if equal to pivot! */
489827bd09bSSatish Balay 	      do {pi++; pi2++;} while (*pi<*ar);
490827bd09bSSatish Balay 	      do {pj--; pj2--;} while (*pj>*ar);
491827bd09bSSatish Balay 
492827bd09bSSatish Balay 	      /* if we've crossed we're done */
493827bd09bSSatish Balay 	      if (pj<pi) break;
494827bd09bSSatish Balay 
495827bd09bSSatish Balay 	      /* else swap */
496827bd09bSSatish Balay 	      SWAP(*pi,*pj)
497827bd09bSSatish Balay 	      P_SWAP(*pi2,*pj2)
498827bd09bSSatish Balay 	    }
499827bd09bSSatish Balay 
500827bd09bSSatish Balay 	  /* place pivot_value in it's correct location */
501827bd09bSSatish Balay 	  SWAP(*ar,*pj)
502827bd09bSSatish Balay 	  P_SWAP(*ar2,*pj2)
503827bd09bSSatish Balay 
504827bd09bSSatish Balay 	  /* test stack_size to see if we've exhausted our stack */
505*ca8e9878SJed Brown 	  if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
506827bd09bSSatish Balay 
507827bd09bSSatish Balay 	  /* push right hand child iff length > 1 */
50852f87cdaSBarry Smith 	  if ((*top_s = size-((PetscInt) (pi-ar))))
509827bd09bSSatish Balay 	    {
510827bd09bSSatish Balay 	      *(top_a++) = pi;
51152f87cdaSBarry Smith 	      *(top_a++) = (PetscInt*) pi2;
512827bd09bSSatish Balay 	      size -= *top_s+2;
513827bd09bSSatish Balay 	      top_s++;
514827bd09bSSatish Balay 	    }
515827bd09bSSatish Balay 	  /* set up for next loop iff there is something to do */
516827bd09bSSatish Balay 	  else if (size -= *top_s+2)
517827bd09bSSatish Balay 	    {;}
518827bd09bSSatish Balay 	  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
519827bd09bSSatish Balay 	  else
520827bd09bSSatish Balay 	    {
52152f87cdaSBarry Smith 	      ar2 = (PetscInt **) *(--top_a);
522827bd09bSSatish Balay 	      ar  = *(--top_a);
523827bd09bSSatish Balay 	      size = *(--top_s);
524827bd09bSSatish Balay 	    }
525827bd09bSSatish Balay 	}
526827bd09bSSatish Balay 
527827bd09bSSatish Balay       /* else sort small list directly then pop another off stack */
528827bd09bSSatish Balay       else
529827bd09bSSatish Balay 	{
530827bd09bSSatish Balay 	  /* insertion sort for bottom */
531827bd09bSSatish Balay           for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++)
532827bd09bSSatish Balay             {
533827bd09bSSatish Balay               temp = *pj;
534827bd09bSSatish Balay               ptr = *pj2;
535827bd09bSSatish Balay               for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--)
536827bd09bSSatish Balay                 {
537827bd09bSSatish Balay                   if (*pi <= temp) break;
538827bd09bSSatish Balay                   *(pi+1)=*pi;
539827bd09bSSatish Balay                   *(pi2+1)=*pi2;
540827bd09bSSatish Balay                 }
541827bd09bSSatish Balay               *(pi+1)=temp;
542827bd09bSSatish Balay               *(pi2+1)=ptr;
543827bd09bSSatish Balay 	    }
544827bd09bSSatish Balay 
545827bd09bSSatish Balay 	  /* check to see if stack is exhausted ==> DONE */
5463fdc5746SBarry Smith 	  if (top_s==bottom_s)   PetscFunctionReturn(0);
547827bd09bSSatish Balay 
548827bd09bSSatish Balay 	  /* else pop another list from the stack */
54952f87cdaSBarry Smith 	  ar2 = (PetscInt **)*(--top_a);
550827bd09bSSatish Balay 	  ar  = *(--top_a);
551827bd09bSSatish Balay 	  size = *(--top_s);
552827bd09bSSatish Balay 	}
553827bd09bSSatish Balay     }
5543fdc5746SBarry Smith   PetscFunctionReturn(0);
555827bd09bSSatish Balay }
556827bd09bSSatish Balay 
5577b1ae94cSBarry Smith /******************************************************************************/
558*ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
559827bd09bSSatish Balay {
5603fdc5746SBarry Smith   PetscFunctionBegin;
561e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
562*ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size);
563*ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
564e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
565*ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt **)ar2,size);
566*ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
567*ca8e9878SJed Brown   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!");
5683fdc5746SBarry Smith   PetscFunctionReturn(0);
569827bd09bSSatish Balay }
570827bd09bSSatish Balay 
5717b1ae94cSBarry Smith /***********************************ivec.c*************************************/
572*ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search( PetscInt item,  PetscInt *list,  PetscInt n)
573827bd09bSSatish Balay {
57452f87cdaSBarry Smith   PetscInt tmp = n-1;
5753fdc5746SBarry Smith   PetscFunctionBegin;
576827bd09bSSatish Balay   while (n--)  {if (*list++ == item) {return(tmp-n);}}
577827bd09bSSatish Balay   return(-1);
578827bd09bSSatish Balay }
579827bd09bSSatish Balay 
5807b1ae94cSBarry Smith /***********************************ivec.c*************************************/
581*ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search( PetscInt item,  PetscInt *list,  PetscInt rh)
582827bd09bSSatish Balay {
58352f87cdaSBarry Smith    PetscInt mid, lh=0;
584827bd09bSSatish Balay 
585827bd09bSSatish Balay   rh--;
586827bd09bSSatish Balay   while (lh<=rh)
587827bd09bSSatish Balay     {
588827bd09bSSatish Balay       mid = (lh+rh)>>1;
589827bd09bSSatish Balay       if (*(list+mid) == item)
590827bd09bSSatish Balay 	{return(mid);}
591827bd09bSSatish Balay       if (*(list+mid) > item)
592827bd09bSSatish Balay 	{rh = mid-1;}
593827bd09bSSatish Balay       else
594827bd09bSSatish Balay 	{lh = mid+1;}
595827bd09bSSatish Balay     }
596827bd09bSSatish Balay   return(-1);
597827bd09bSSatish Balay }
598827bd09bSSatish Balay 
5997b1ae94cSBarry Smith /*********************************ivec.c*************************************/
600*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
601827bd09bSSatish Balay {
6023fdc5746SBarry Smith   PetscFunctionBegin;
603827bd09bSSatish Balay   while (n--)  {*arg1++ = *arg2++;}
6043fdc5746SBarry Smith   PetscFunctionReturn(0);
605827bd09bSSatish Balay }
606827bd09bSSatish Balay 
6077b1ae94cSBarry Smith /*********************************ivec.c*************************************/
608*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero( PetscScalar *arg1,  PetscInt n)
609827bd09bSSatish Balay {
6103fdc5746SBarry Smith   PetscFunctionBegin;
611827bd09bSSatish Balay   while (n--)  {*arg1++ = 0.0;}
6123fdc5746SBarry Smith   PetscFunctionReturn(0);
613827bd09bSSatish Balay }
614827bd09bSSatish Balay 
6157b1ae94cSBarry Smith /***********************************ivec.c*************************************/
616*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one( PetscScalar *arg1,  PetscInt n)
617827bd09bSSatish Balay {
6183fdc5746SBarry Smith   PetscFunctionBegin;
619827bd09bSSatish Balay   while (n--)  {*arg1++ = 1.0;}
6203fdc5746SBarry Smith   PetscFunctionReturn(0);
621827bd09bSSatish Balay }
622827bd09bSSatish Balay 
6237b1ae94cSBarry Smith /***********************************ivec.c*************************************/
624*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set( PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
625827bd09bSSatish Balay {
6263fdc5746SBarry Smith   PetscFunctionBegin;
627827bd09bSSatish Balay   while (n--)  {*arg1++ = arg2;}
6283fdc5746SBarry Smith   PetscFunctionReturn(0);
629827bd09bSSatish Balay }
630827bd09bSSatish Balay 
6317b1ae94cSBarry Smith /***********************************ivec.c*************************************/
632*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale( PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
633827bd09bSSatish Balay {
6343fdc5746SBarry Smith   PetscFunctionBegin;
635827bd09bSSatish Balay   while (n--)  {*arg1++ *= arg2;}
6363fdc5746SBarry Smith   PetscFunctionReturn(0);
637827bd09bSSatish Balay }
638827bd09bSSatish Balay 
6397b1ae94cSBarry Smith /*********************************ivec.c*************************************/
640*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
641827bd09bSSatish Balay {
6423fdc5746SBarry Smith   PetscFunctionBegin;
643827bd09bSSatish Balay   while (n--)  {*arg1++ += *arg2++;}
6443fdc5746SBarry Smith   PetscFunctionReturn(0);
645827bd09bSSatish Balay }
646827bd09bSSatish Balay 
6477b1ae94cSBarry Smith /*********************************ivec.c*************************************/
648*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
649827bd09bSSatish Balay {
6503fdc5746SBarry Smith   PetscFunctionBegin;
651827bd09bSSatish Balay   while (n--)  {*arg1++ *= *arg2++;}
6523fdc5746SBarry Smith   PetscFunctionReturn(0);
653827bd09bSSatish Balay }
654827bd09bSSatish Balay 
6557b1ae94cSBarry Smith /*********************************ivec.c*************************************/
656*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
657827bd09bSSatish Balay {
6583fdc5746SBarry Smith   PetscFunctionBegin;
65939945688SSatish Balay   while (n--)  {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;}
6603fdc5746SBarry Smith   PetscFunctionReturn(0);
661827bd09bSSatish Balay }
662827bd09bSSatish Balay 
6637b1ae94cSBarry Smith /*********************************ivec.c*************************************/
664*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
665827bd09bSSatish Balay {
6663fdc5746SBarry Smith   PetscFunctionBegin;
667827bd09bSSatish Balay   while (n--)  {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;}
6683fdc5746SBarry Smith   PetscFunctionReturn(0);
669827bd09bSSatish Balay }
670827bd09bSSatish Balay 
6717b1ae94cSBarry Smith /*********************************ivec.c*************************************/
672*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
673827bd09bSSatish Balay {
6743fdc5746SBarry Smith   PetscFunctionBegin;
67539945688SSatish Balay   while (n--)  {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;}
6763fdc5746SBarry Smith   PetscFunctionReturn(0);
677827bd09bSSatish Balay }
678827bd09bSSatish Balay 
6797b1ae94cSBarry Smith /*********************************ivec.c*************************************/
680*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
681827bd09bSSatish Balay {
6823fdc5746SBarry Smith   PetscFunctionBegin;
683827bd09bSSatish Balay   while (n--)  {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;}
6843fdc5746SBarry Smith   PetscFunctionReturn(0);
685827bd09bSSatish Balay }
686827bd09bSSatish Balay 
6877b1ae94cSBarry Smith /*********************************ivec.c*************************************/
688*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists( PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
689827bd09bSSatish Balay {
6903fdc5746SBarry Smith   PetscFunctionBegin;
691827bd09bSSatish Balay   while (n--)  {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;}
6923fdc5746SBarry Smith   PetscFunctionReturn(0);
693827bd09bSSatish Balay }
694827bd09bSSatish Balay 
6957b1ae94cSBarry Smith /***********************************ivec.c*************************************/
696*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  PetscInt n,  PetscInt *arg3)
697827bd09bSSatish Balay {
69852f87cdaSBarry Smith    PetscInt i, j, type;
699827bd09bSSatish Balay 
7003fdc5746SBarry Smith   PetscFunctionBegin;
701827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
702827bd09bSSatish Balay   for (i=0;i<n;)
703827bd09bSSatish Balay     {
704827bd09bSSatish Balay       /* clump 'em for now */
705827bd09bSSatish Balay       j=i+1;
706827bd09bSSatish Balay       type = arg3[i];
707827bd09bSSatish Balay       while ((j<n)&&(arg3[j]==type))
708827bd09bSSatish Balay 	{j++;}
709827bd09bSSatish Balay 
710827bd09bSSatish Balay       /* how many together */
711827bd09bSSatish Balay       j -= i;
712827bd09bSSatish Balay 
713827bd09bSSatish Balay       /* call appropriate ivec function */
714827bd09bSSatish Balay       if (type == GL_MAX)
715*ca8e9878SJed Brown 	{PCTFS_rvec_max(arg1,arg2,j);}
716827bd09bSSatish Balay       else if (type == GL_MIN)
717*ca8e9878SJed Brown 	{PCTFS_rvec_min(arg1,arg2,j);}
718827bd09bSSatish Balay       else if (type == GL_MULT)
719*ca8e9878SJed Brown 	{PCTFS_rvec_mult(arg1,arg2,j);}
720827bd09bSSatish Balay       else if (type == GL_ADD)
721*ca8e9878SJed Brown 	{PCTFS_rvec_add(arg1,arg2,j);}
722827bd09bSSatish Balay       else if (type == GL_MAX_ABS)
723*ca8e9878SJed Brown 	{PCTFS_rvec_max_abs(arg1,arg2,j);}
724827bd09bSSatish Balay       else if (type == GL_MIN_ABS)
725*ca8e9878SJed Brown 	{PCTFS_rvec_min_abs(arg1,arg2,j);}
726827bd09bSSatish Balay       else if (type == GL_EXISTS)
727*ca8e9878SJed Brown 	{PCTFS_rvec_exists(arg1,arg2,j);}
728*ca8e9878SJed Brown       else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!");
729827bd09bSSatish Balay 
730827bd09bSSatish Balay       arg1+=j; arg2+=j; i+=j;
731827bd09bSSatish Balay     }
7323fdc5746SBarry Smith   PetscFunctionReturn(0);
733827bd09bSSatish Balay }
734827bd09bSSatish Balay 
7357b1ae94cSBarry Smith /***********************************ivec.c*************************************/
736*ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr( PetscInt type)
737827bd09bSSatish Balay {
738827bd09bSSatish Balay   if (type == NON_UNIFORM)
739*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_non_uniform);}
740827bd09bSSatish Balay   else if (type == GL_MAX)
741*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_max);}
742827bd09bSSatish Balay   else if (type == GL_MIN)
743*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_min);}
744827bd09bSSatish Balay   else if (type == GL_MULT)
745*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_mult);}
746827bd09bSSatish Balay   else if (type == GL_ADD)
747*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_add);}
748827bd09bSSatish Balay   else if (type == GL_MAX_ABS)
749*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_max_abs);}
750827bd09bSSatish Balay   else if (type == GL_MIN_ABS)
751*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_min_abs);}
752827bd09bSSatish Balay   else if (type == GL_EXISTS)
753*ca8e9878SJed Brown     {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_exists);}
754827bd09bSSatish Balay 
755827bd09bSSatish Balay   /* catch all ... not good if we get here */
756827bd09bSSatish Balay   return(NULL);
757827bd09bSSatish Balay }
758827bd09bSSatish Balay 
759827bd09bSSatish Balay 
760827bd09bSSatish Balay 
761827bd09bSSatish Balay 
762827bd09bSSatish Balay 
763827bd09bSSatish Balay 
764