xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 6ae68b59b00028bc0b4bcac6e1dc29f8d4e2af92)
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 /* allocate an address and size stack for sorter(s) */
24827bd09bSSatish Balay static void     *offset_stack[2*SORT_STACK];
2552f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK];
26827bd09bSSatish Balay 
277b1ae94cSBarry Smith /***********************************ivec.c*************************************/
28ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n)
29827bd09bSSatish Balay {
302fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
31827bd09bSSatish Balay   return(arg1);
32827bd09bSSatish Balay }
33827bd09bSSatish Balay 
347b1ae94cSBarry Smith /***********************************ivec.c*************************************/
35ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n)
36827bd09bSSatish Balay {
373fdc5746SBarry Smith   PetscFunctionBegin;
382fa5cd67SKarl Rupp   while (n--) *arg1++ = 0;
393fdc5746SBarry Smith   PetscFunctionReturn(0);
40827bd09bSSatish Balay }
41827bd09bSSatish Balay 
427b1ae94cSBarry Smith /***********************************ivec.c*************************************/
43ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n)
44827bd09bSSatish Balay {
453fdc5746SBarry Smith   PetscFunctionBegin;
462fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
473fdc5746SBarry Smith   PetscFunctionReturn(0);
48827bd09bSSatish Balay }
49827bd09bSSatish Balay 
507b1ae94cSBarry Smith /***********************************ivec.c*************************************/
51ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_max(PetscInt *arg1, PetscInt *arg2, PetscInt n)
52827bd09bSSatish Balay {
533fdc5746SBarry Smith   PetscFunctionBegin;
5439945688SSatish Balay   while (n--) { *arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++; }
553fdc5746SBarry Smith   PetscFunctionReturn(0);
56827bd09bSSatish Balay }
57827bd09bSSatish Balay 
587b1ae94cSBarry Smith /***********************************ivec.c*************************************/
59ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
60827bd09bSSatish Balay {
613fdc5746SBarry Smith   PetscFunctionBegin;
622fa5cd67SKarl Rupp   while (n--) {
632fa5cd67SKarl Rupp     *(arg1) = PetscMin(*arg1,*arg2);
642fa5cd67SKarl Rupp     arg1++;
652fa5cd67SKarl Rupp     arg2++;
662fa5cd67SKarl Rupp   }
673fdc5746SBarry Smith   PetscFunctionReturn(0);
68827bd09bSSatish Balay }
69827bd09bSSatish Balay 
707b1ae94cSBarry Smith /***********************************ivec.c*************************************/
71ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
72827bd09bSSatish Balay {
733fdc5746SBarry Smith   PetscFunctionBegin;
742fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
753fdc5746SBarry Smith   PetscFunctionReturn(0);
76827bd09bSSatish Balay }
77827bd09bSSatish Balay 
787b1ae94cSBarry Smith /***********************************ivec.c*************************************/
79ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
80827bd09bSSatish Balay {
813fdc5746SBarry Smith   PetscFunctionBegin;
822fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
833fdc5746SBarry Smith   PetscFunctionReturn(0);
84827bd09bSSatish Balay }
85827bd09bSSatish Balay 
867b1ae94cSBarry Smith /***********************************ivec.c*************************************/
87ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
88827bd09bSSatish Balay {
893fdc5746SBarry Smith   PetscFunctionBegin;
902fa5cd67SKarl Rupp   while (n--) {
912fa5cd67SKarl Rupp     *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2));
922fa5cd67SKarl Rupp     arg1++;
932fa5cd67SKarl Rupp     arg2++;
942fa5cd67SKarl Rupp   }
953fdc5746SBarry Smith   PetscFunctionReturn(0);
96827bd09bSSatish Balay }
97827bd09bSSatish Balay 
987b1ae94cSBarry Smith /***********************************ivec.c*************************************/
99ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
100827bd09bSSatish Balay {
1013fdc5746SBarry Smith   PetscFunctionBegin;
1022fa5cd67SKarl Rupp   while (n--) *arg1++ ^= *arg2++;
1033fdc5746SBarry Smith   PetscFunctionReturn(0);
104827bd09bSSatish Balay }
105827bd09bSSatish Balay 
1067b1ae94cSBarry Smith /***********************************ivec.c*************************************/
107ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
108827bd09bSSatish Balay {
1093fdc5746SBarry Smith   PetscFunctionBegin;
1102fa5cd67SKarl Rupp   while (n--) *arg1++ |= *arg2++;
1113fdc5746SBarry Smith   PetscFunctionReturn(0);
112827bd09bSSatish Balay }
113827bd09bSSatish Balay 
1147b1ae94cSBarry Smith /***********************************ivec.c*************************************/
115ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
116827bd09bSSatish Balay {
1173fdc5746SBarry Smith   PetscFunctionBegin;
1182fa5cd67SKarl Rupp   while (n--) {
1192fa5cd67SKarl Rupp     *arg1 = (*arg1 || *arg2);
1202fa5cd67SKarl Rupp     arg1++;
1212fa5cd67SKarl Rupp     arg2++;
1222fa5cd67SKarl Rupp   }
1233fdc5746SBarry Smith   PetscFunctionReturn(0);
124827bd09bSSatish Balay }
125827bd09bSSatish Balay 
1267b1ae94cSBarry Smith /***********************************ivec.c*************************************/
127ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
128827bd09bSSatish Balay {
1293fdc5746SBarry Smith   PetscFunctionBegin;
1302fa5cd67SKarl Rupp   while (n--) *arg1++ &= *arg2++;
1313fdc5746SBarry Smith   PetscFunctionReturn(0);
132827bd09bSSatish Balay }
133827bd09bSSatish Balay 
1347b1ae94cSBarry Smith /***********************************ivec.c*************************************/
135ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
136827bd09bSSatish Balay {
1373fdc5746SBarry Smith   PetscFunctionBegin;
1382fa5cd67SKarl Rupp   while (n--) {
1392fa5cd67SKarl Rupp     *arg1 = (*arg1 && *arg2);
1402fa5cd67SKarl Rupp     arg1++;
1412fa5cd67SKarl Rupp     arg2++;
1422fa5cd67SKarl Rupp   }
1433fdc5746SBarry Smith   PetscFunctionReturn(0);
144827bd09bSSatish Balay }
145827bd09bSSatish Balay 
1467b1ae94cSBarry Smith /***********************************ivec.c*************************************/
147ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1,  PetscInt *arg2,  PetscInt *arg3, PetscInt n)
148827bd09bSSatish Balay {
1493fdc5746SBarry Smith   PetscFunctionBegin;
1502fa5cd67SKarl Rupp   while (n--) *arg1++ = (*arg2++ & *arg3++);
1513fdc5746SBarry Smith   PetscFunctionReturn(0);
152827bd09bSSatish Balay }
153827bd09bSSatish Balay 
1547b1ae94cSBarry Smith /***********************************ivec.c*************************************/
155ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1,  PetscInt n)
156827bd09bSSatish Balay {
15752f87cdaSBarry Smith   PetscInt tmp = 0;
1582fa5cd67SKarl Rupp   while (n--) tmp += *arg1++;
159827bd09bSSatish Balay   return(tmp);
160827bd09bSSatish Balay }
161827bd09bSSatish Balay 
1627b1ae94cSBarry Smith /***********************************ivec.c*************************************/
163*6ae68b59SBarry Smith PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2,  PetscInt n, ...)
164827bd09bSSatish Balay {
16552f87cdaSBarry Smith   PetscInt i, j, type;
166*6ae68b59SBarry Smith   PetscInt *arg3;
167*6ae68b59SBarry Smith   va_list  ap;
168827bd09bSSatish Balay 
1693fdc5746SBarry Smith   PetscFunctionBegin;
170*6ae68b59SBarry Smith   va_start(ap, n);
171*6ae68b59SBarry Smith   arg3 = va_arg(ap, PetscInt*);
172*6ae68b59SBarry Smith   va_end(ap);
173*6ae68b59SBarry Smith 
174827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
175db4deed7SKarl Rupp   for (i=0; i<n;) {
176827bd09bSSatish Balay     /* clump 'em for now */
177827bd09bSSatish Balay     j    =i+1;
178827bd09bSSatish Balay     type = arg3[i];
1792fa5cd67SKarl Rupp     while ((j<n)&&(arg3[j]==type)) j++;
180827bd09bSSatish Balay 
181827bd09bSSatish Balay     /* how many together */
182827bd09bSSatish Balay     j -= i;
183827bd09bSSatish Balay 
184827bd09bSSatish Balay     /* call appropriate ivec function */
1852fa5cd67SKarl Rupp     if (type == GL_MAX)        PCTFS_ivec_max(arg1,arg2,j);
1862fa5cd67SKarl Rupp     else if (type == GL_MIN)   PCTFS_ivec_min(arg1,arg2,j);
1872fa5cd67SKarl Rupp     else if (type == GL_MULT)  PCTFS_ivec_mult(arg1,arg2,j);
1882fa5cd67SKarl Rupp     else if (type == GL_ADD)   PCTFS_ivec_add(arg1,arg2,j);
1892fa5cd67SKarl Rupp     else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j);
1902fa5cd67SKarl Rupp     else if (type == GL_B_OR)  PCTFS_ivec_or(arg1,arg2,j);
1912fa5cd67SKarl Rupp     else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j);
1922fa5cd67SKarl Rupp     else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j);
1932fa5cd67SKarl Rupp     else if (type == GL_L_OR)  PCTFS_ivec_lor(arg1,arg2,j);
1942fa5cd67SKarl Rupp     else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j);
195db4deed7SKarl Rupp     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_ivec_non_uniform()!");
196827bd09bSSatish Balay 
197827bd09bSSatish Balay     arg1+=j; arg2+=j; i+=j;
198827bd09bSSatish Balay   }
1993fdc5746SBarry Smith   PetscFunctionReturn(0);
200827bd09bSSatish Balay }
201827bd09bSSatish Balay 
2027b1ae94cSBarry Smith /***********************************ivec.c*************************************/
203ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type)
204827bd09bSSatish Balay {
2052fa5cd67SKarl Rupp   if (type == NON_UNIFORM)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform);
2062fa5cd67SKarl Rupp   else if (type == GL_MAX)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max);
2072fa5cd67SKarl Rupp   else if (type == GL_MIN)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min);
2082fa5cd67SKarl Rupp   else if (type == GL_MULT)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult);
2092fa5cd67SKarl Rupp   else if (type == GL_ADD)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add);
2102fa5cd67SKarl Rupp   else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor);
2112fa5cd67SKarl Rupp   else if (type == GL_B_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or);
2122fa5cd67SKarl Rupp   else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and);
2132fa5cd67SKarl Rupp   else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor);
2142fa5cd67SKarl Rupp   else if (type == GL_L_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor);
2152fa5cd67SKarl Rupp   else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land);
216827bd09bSSatish Balay 
217827bd09bSSatish Balay   /* catch all ... not good if we get here */
218827bd09bSSatish Balay   return(NULL);
219827bd09bSSatish Balay }
220827bd09bSSatish Balay 
2217b1ae94cSBarry Smith /******************************************************************************/
222ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar,  PetscInt size)
223827bd09bSSatish Balay {
22452f87cdaSBarry Smith   PetscInt *pi, *pj, temp;
22552f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**) offset_stack;
22652f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
227827bd09bSSatish Balay 
228b458e8f1SJose E. Roman   PetscFunctionBegin;
229827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
230827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
231827bd09bSSatish Balay   size--;
232827bd09bSSatish Balay 
233827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
234db4deed7SKarl Rupp   for (;;) {
235827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
236db4deed7SKarl Rupp     if (size > SORT_OPT) {
237827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
238827bd09bSSatish Balay       pi = ar+1;
239827bd09bSSatish Balay       pj = ar+size;
240827bd09bSSatish Balay 
241827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
242827bd09bSSatish Balay       SWAP(*(ar+(size>>1)),*pi)
243827bd09bSSatish Balay 
244827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
245827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
246db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) }
247db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) }
248db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) }
249827bd09bSSatish Balay 
250827bd09bSSatish Balay       /* partition about pivot_value ...                              */
251827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
252db4deed7SKarl Rupp       for (;;) {
253827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
254827bd09bSSatish Balay         do pi++; while (*pi<*ar);
255827bd09bSSatish Balay         do pj--; while (*pj>*ar);
256827bd09bSSatish Balay 
257827bd09bSSatish Balay         /* if we've crossed we're done */
258827bd09bSSatish Balay         if (pj<pi) break;
259827bd09bSSatish Balay 
260827bd09bSSatish Balay         /* else swap */
261827bd09bSSatish Balay         SWAP(*pi,*pj)
262827bd09bSSatish Balay       }
263827bd09bSSatish Balay 
264827bd09bSSatish Balay       /* place pivot_value in it's correct location */
265827bd09bSSatish Balay       SWAP(*ar,*pj)
266827bd09bSSatish Balay 
267827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
268ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!");
269827bd09bSSatish Balay 
270827bd09bSSatish Balay       /* push right hand child iff length > 1 */
271db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
272827bd09bSSatish Balay         *(top_a++) = pi;
273827bd09bSSatish Balay         size      -= *top_s+2;
274827bd09bSSatish Balay         top_s++;
2752fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
276db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
277827bd09bSSatish Balay         ar   = *(--top_a);
278827bd09bSSatish Balay         size = *(--top_s);
279827bd09bSSatish Balay       }
280db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
281827bd09bSSatish Balay 
282827bd09bSSatish Balay       /* insertion sort for bottom */
283db4deed7SKarl Rupp       for (pj=ar+1; pj<=ar+size; pj++) {
284827bd09bSSatish Balay         temp = *pj;
285db4deed7SKarl Rupp         for (pi=pj-1; pi>=ar; pi--) {
286827bd09bSSatish Balay           if (*pi <= temp) break;
287827bd09bSSatish Balay           *(pi+1)=*pi;
288827bd09bSSatish Balay         }
289827bd09bSSatish Balay         *(pi+1)=temp;
290827bd09bSSatish Balay       }
291827bd09bSSatish Balay 
292827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
2933fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
294827bd09bSSatish Balay 
295827bd09bSSatish Balay       /* else pop another list from the stack */
296827bd09bSSatish Balay       ar   = *(--top_a);
297827bd09bSSatish Balay       size = *(--top_s);
298827bd09bSSatish Balay     }
299827bd09bSSatish Balay   }
300827bd09bSSatish Balay }
301827bd09bSSatish Balay 
3027b1ae94cSBarry Smith /******************************************************************************/
303ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar,  PetscInt *ar2,  PetscInt size)
304827bd09bSSatish Balay {
30552f87cdaSBarry Smith   PetscInt *pi, *pj, temp, temp2;
30652f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
30752f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
30852f87cdaSBarry Smith   PetscInt *pi2, *pj2;
30952f87cdaSBarry Smith   PetscInt mid;
310827bd09bSSatish Balay 
3113fdc5746SBarry Smith   PetscFunctionBegin;
312827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
313827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
314827bd09bSSatish Balay   size--;
315827bd09bSSatish Balay 
316827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
317db4deed7SKarl Rupp   for (;;) {
318db4deed7SKarl Rupp 
319827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
320db4deed7SKarl Rupp     if (size > SORT_OPT) {
321db4deed7SKarl Rupp 
322827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
323827bd09bSSatish Balay       mid = size>>1;
324827bd09bSSatish Balay       pi  = ar+1;
325827bd09bSSatish Balay       pj  = ar+mid;
326827bd09bSSatish Balay       pi2 = ar2+1;
327827bd09bSSatish Balay       pj2 = ar2+mid;
328827bd09bSSatish Balay 
329827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
330827bd09bSSatish Balay       SWAP(*pi,*pj)
331827bd09bSSatish Balay       SWAP(*pi2,*pj2)
332827bd09bSSatish Balay 
333827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
334827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
335827bd09bSSatish Balay       pj  = ar+size;
336827bd09bSSatish Balay       pj2 = ar2+size;
337db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) }
338db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) }
339db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) }
340827bd09bSSatish Balay 
341827bd09bSSatish Balay       /* partition about pivot_value ...                              */
342827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
343db4deed7SKarl Rupp       for (;;) {
344827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
345827bd09bSSatish Balay         do { pi++; pi2++; } while (*pi<*ar);
346827bd09bSSatish Balay         do { pj--; pj2--; } while (*pj>*ar);
347827bd09bSSatish Balay 
348827bd09bSSatish Balay         /* if we've crossed we're done */
349827bd09bSSatish Balay         if (pj<pi) break;
350827bd09bSSatish Balay 
351827bd09bSSatish Balay         /* else swap */
352827bd09bSSatish Balay         SWAP(*pi,*pj)
353827bd09bSSatish Balay         SWAP(*pi2,*pj2)
354827bd09bSSatish Balay       }
355827bd09bSSatish Balay 
356827bd09bSSatish Balay       /* place pivot_value in it's correct location */
357827bd09bSSatish Balay       SWAP(*ar,*pj)
358827bd09bSSatish Balay       SWAP(*ar2,*pj2)
359827bd09bSSatish Balay 
360827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
361ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!");
362827bd09bSSatish Balay 
363827bd09bSSatish Balay       /* push right hand child iff length > 1 */
364db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
365827bd09bSSatish Balay         *(top_a++) = pi;
366827bd09bSSatish Balay         *(top_a++) = pi2;
367827bd09bSSatish Balay         size      -= *top_s+2;
368827bd09bSSatish Balay         top_s++;
3692fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
370db4deed7SKarl Rupp       else {  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
371827bd09bSSatish Balay         ar2  = *(--top_a);
372827bd09bSSatish Balay         ar   = *(--top_a);
373827bd09bSSatish Balay         size = *(--top_s);
374827bd09bSSatish Balay       }
375db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
376827bd09bSSatish Balay 
377827bd09bSSatish Balay       /* insertion sort for bottom */
378db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
379827bd09bSSatish Balay         temp  = *pj;
380827bd09bSSatish Balay         temp2 = *pj2;
381db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
382827bd09bSSatish Balay           if (*pi <= temp) break;
383827bd09bSSatish Balay           *(pi+1) =*pi;
384827bd09bSSatish Balay           *(pi2+1)=*pi2;
385827bd09bSSatish Balay         }
386827bd09bSSatish Balay         *(pi+1) =temp;
387827bd09bSSatish Balay         *(pi2+1)=temp2;
388827bd09bSSatish Balay       }
389827bd09bSSatish Balay 
390827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
3913fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
392827bd09bSSatish Balay 
393827bd09bSSatish Balay       /* else pop another list from the stack */
394827bd09bSSatish Balay       ar2  = *(--top_a);
395827bd09bSSatish Balay       ar   = *(--top_a);
396827bd09bSSatish Balay       size = *(--top_s);
397827bd09bSSatish Balay     }
398827bd09bSSatish Balay   }
399827bd09bSSatish Balay }
400827bd09bSSatish Balay 
4017b1ae94cSBarry Smith /******************************************************************************/
402ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar,  PetscInt **ar2, PetscInt size)
403827bd09bSSatish Balay {
40452f87cdaSBarry Smith   PetscInt *pi, *pj, temp, *ptr;
40552f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
40652f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
40752f87cdaSBarry Smith   PetscInt **pi2, **pj2;
40852f87cdaSBarry Smith   PetscInt mid;
409827bd09bSSatish Balay 
4103fdc5746SBarry Smith   PetscFunctionBegin;
411827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
412827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
413827bd09bSSatish Balay   size--;
414827bd09bSSatish Balay 
415827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
416db4deed7SKarl Rupp   for (;;) {
417db4deed7SKarl Rupp 
418827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
419db4deed7SKarl Rupp     if (size > SORT_OPT) {
420db4deed7SKarl Rupp 
421827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
422827bd09bSSatish Balay       mid = size>>1;
423827bd09bSSatish Balay       pi  = ar+1;
424827bd09bSSatish Balay       pj  = ar+mid;
425827bd09bSSatish Balay       pi2 = ar2+1;
426827bd09bSSatish Balay       pj2 = ar2+mid;
427827bd09bSSatish Balay 
428827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
429827bd09bSSatish Balay       SWAP(*pi,*pj)
430827bd09bSSatish Balay       P_SWAP(*pi2,*pj2)
431827bd09bSSatish Balay 
432827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
433827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
434827bd09bSSatish Balay       pj  = ar+size;
435827bd09bSSatish Balay       pj2 = ar2+size;
436db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) }
437db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) }
438db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) }
439827bd09bSSatish Balay 
440827bd09bSSatish Balay       /* partition about pivot_value ...                              */
441827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
442db4deed7SKarl Rupp       for (;;) {
443db4deed7SKarl Rupp 
444827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
445827bd09bSSatish Balay         do {pi++; pi2++;} while (*pi<*ar);
446827bd09bSSatish Balay         do {pj--; pj2--;} while (*pj>*ar);
447827bd09bSSatish Balay 
448827bd09bSSatish Balay         /* if we've crossed we're done */
449827bd09bSSatish Balay         if (pj<pi) break;
450827bd09bSSatish Balay 
451827bd09bSSatish Balay         /* else swap */
452827bd09bSSatish Balay         SWAP(*pi,*pj)
453827bd09bSSatish Balay         P_SWAP(*pi2,*pj2)
454827bd09bSSatish Balay       }
455827bd09bSSatish Balay 
456827bd09bSSatish Balay       /* place pivot_value in it's correct location */
457827bd09bSSatish Balay       SWAP(*ar,*pj)
458827bd09bSSatish Balay       P_SWAP(*ar2,*pj2)
459827bd09bSSatish Balay 
460827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
461ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
462827bd09bSSatish Balay 
463827bd09bSSatish Balay       /* push right hand child iff length > 1 */
464db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
465827bd09bSSatish Balay         *(top_a++) = pi;
46652f87cdaSBarry Smith         *(top_a++) = (PetscInt*) pi2;
467827bd09bSSatish Balay         size      -= *top_s+2;
468827bd09bSSatish Balay         top_s++;
4692fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
470db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
47152f87cdaSBarry Smith         ar2  = (PetscInt**) *(--top_a);
472827bd09bSSatish Balay         ar   = *(--top_a);
473827bd09bSSatish Balay         size = *(--top_s);
474827bd09bSSatish Balay       }
4752fa5cd67SKarl Rupp     } else  { /* else sort small list directly then pop another off stack */
476827bd09bSSatish Balay       /* insertion sort for bottom */
477db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
478827bd09bSSatish Balay         temp = *pj;
479827bd09bSSatish Balay         ptr  = *pj2;
480db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
481827bd09bSSatish Balay           if (*pi <= temp) break;
482827bd09bSSatish Balay           *(pi+1) =*pi;
483827bd09bSSatish Balay           *(pi2+1)=*pi2;
484827bd09bSSatish Balay         }
485827bd09bSSatish Balay         *(pi+1) =temp;
486827bd09bSSatish Balay         *(pi2+1)=ptr;
487827bd09bSSatish Balay       }
488827bd09bSSatish Balay 
489827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
4903fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
491827bd09bSSatish Balay 
492827bd09bSSatish Balay       /* else pop another list from the stack */
49352f87cdaSBarry Smith       ar2  = (PetscInt**)*(--top_a);
494827bd09bSSatish Balay       ar   = *(--top_a);
495827bd09bSSatish Balay       size = *(--top_s);
496827bd09bSSatish Balay     }
497827bd09bSSatish Balay   }
498827bd09bSSatish Balay }
499827bd09bSSatish Balay 
5007b1ae94cSBarry Smith /******************************************************************************/
501ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
502827bd09bSSatish Balay {
5033fdc5746SBarry Smith   PetscFunctionBegin;
504e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
505ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size);
506ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
507e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
508ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size);
509ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
510ca8e9878SJed Brown   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!");
5113fdc5746SBarry Smith   PetscFunctionReturn(0);
512827bd09bSSatish Balay }
513827bd09bSSatish Balay 
5147b1ae94cSBarry Smith /***********************************ivec.c*************************************/
515ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item,  PetscInt *list,  PetscInt n)
516827bd09bSSatish Balay {
51752f87cdaSBarry Smith   PetscInt tmp = n-1;
5185fd66863SKarl Rupp 
5192fa5cd67SKarl Rupp   while (n--) {
5202fa5cd67SKarl Rupp     if (*list++ == item) return(tmp-n);
5212fa5cd67SKarl Rupp   }
522827bd09bSSatish Balay   return(-1);
523827bd09bSSatish Balay }
524827bd09bSSatish Balay 
5257b1ae94cSBarry Smith /***********************************ivec.c*************************************/
526ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search(PetscInt item,  PetscInt *list,  PetscInt rh)
527827bd09bSSatish Balay {
52852f87cdaSBarry Smith   PetscInt mid, lh=0;
529827bd09bSSatish Balay 
530827bd09bSSatish Balay   rh--;
531db4deed7SKarl Rupp   while (lh<=rh) {
532827bd09bSSatish Balay     mid = (lh+rh)>>1;
5332fa5cd67SKarl Rupp     if (*(list+mid) == item) return(mid);
5342fa5cd67SKarl Rupp     if (*(list+mid) > item) rh = mid-1;
5352fa5cd67SKarl Rupp     else lh = mid+1;
536827bd09bSSatish Balay   }
537827bd09bSSatish Balay   return(-1);
538827bd09bSSatish Balay }
539827bd09bSSatish Balay 
5407b1ae94cSBarry Smith /*********************************ivec.c*************************************/
541ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
542827bd09bSSatish Balay {
5433fdc5746SBarry Smith   PetscFunctionBegin;
5442fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
5453fdc5746SBarry Smith   PetscFunctionReturn(0);
546827bd09bSSatish Balay }
547827bd09bSSatish Balay 
5487b1ae94cSBarry Smith /*********************************ivec.c*************************************/
549ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1,  PetscInt n)
550827bd09bSSatish Balay {
5513fdc5746SBarry Smith   PetscFunctionBegin;
5522fa5cd67SKarl Rupp   while (n--) *arg1++ = 0.0;
5533fdc5746SBarry Smith   PetscFunctionReturn(0);
554827bd09bSSatish Balay }
555827bd09bSSatish Balay 
5567b1ae94cSBarry Smith /***********************************ivec.c*************************************/
557ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1,  PetscInt n)
558827bd09bSSatish Balay {
5593fdc5746SBarry Smith   PetscFunctionBegin;
5602fa5cd67SKarl Rupp   while (n--) *arg1++ = 1.0;
5613fdc5746SBarry Smith   PetscFunctionReturn(0);
562827bd09bSSatish Balay }
563827bd09bSSatish Balay 
5647b1ae94cSBarry Smith /***********************************ivec.c*************************************/
565ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
566827bd09bSSatish Balay {
5673fdc5746SBarry Smith   PetscFunctionBegin;
5682fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
5693fdc5746SBarry Smith   PetscFunctionReturn(0);
570827bd09bSSatish Balay }
571827bd09bSSatish Balay 
5727b1ae94cSBarry Smith /***********************************ivec.c*************************************/
573ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
574827bd09bSSatish Balay {
5753fdc5746SBarry Smith   PetscFunctionBegin;
5762fa5cd67SKarl Rupp   while (n--) *arg1++ *= arg2;
5773fdc5746SBarry Smith   PetscFunctionReturn(0);
578827bd09bSSatish Balay }
579827bd09bSSatish Balay 
5807b1ae94cSBarry Smith /*********************************ivec.c*************************************/
581ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
582827bd09bSSatish Balay {
5833fdc5746SBarry Smith   PetscFunctionBegin;
5842fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
5853fdc5746SBarry Smith   PetscFunctionReturn(0);
586827bd09bSSatish Balay }
587827bd09bSSatish Balay 
5887b1ae94cSBarry Smith /*********************************ivec.c*************************************/
589ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
590827bd09bSSatish Balay {
5913fdc5746SBarry Smith   PetscFunctionBegin;
5922fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
5933fdc5746SBarry Smith   PetscFunctionReturn(0);
594827bd09bSSatish Balay }
595827bd09bSSatish Balay 
5967b1ae94cSBarry Smith /*********************************ivec.c*************************************/
597ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
598827bd09bSSatish Balay {
5993fdc5746SBarry Smith   PetscFunctionBegin;
6002fa5cd67SKarl Rupp   while (n--) {
6012fa5cd67SKarl Rupp     *arg1 = PetscMax(*arg1,*arg2);
6022fa5cd67SKarl Rupp     arg1++;
6032fa5cd67SKarl Rupp     arg2++;
6042fa5cd67SKarl Rupp   }
6053fdc5746SBarry Smith   PetscFunctionReturn(0);
606827bd09bSSatish Balay }
607827bd09bSSatish Balay 
6087b1ae94cSBarry Smith /*********************************ivec.c*************************************/
609ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
610827bd09bSSatish Balay {
6113fdc5746SBarry Smith   PetscFunctionBegin;
6122fa5cd67SKarl Rupp   while (n--) {
6132fa5cd67SKarl Rupp     *arg1 = MAX_FABS(*arg1,*arg2);
6142fa5cd67SKarl Rupp     arg1++;
6152fa5cd67SKarl Rupp     arg2++;
6162fa5cd67SKarl Rupp   }
6173fdc5746SBarry Smith   PetscFunctionReturn(0);
618827bd09bSSatish Balay }
619827bd09bSSatish Balay 
6207b1ae94cSBarry Smith /*********************************ivec.c*************************************/
621ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
622827bd09bSSatish Balay {
6233fdc5746SBarry Smith   PetscFunctionBegin;
6242fa5cd67SKarl Rupp   while (n--) {
6252fa5cd67SKarl Rupp     *arg1 = PetscMin(*arg1,*arg2);
6262fa5cd67SKarl Rupp     arg1++;
6272fa5cd67SKarl Rupp     arg2++;
6282fa5cd67SKarl Rupp   }
6293fdc5746SBarry Smith   PetscFunctionReturn(0);
630827bd09bSSatish Balay }
631827bd09bSSatish Balay 
6327b1ae94cSBarry Smith /*********************************ivec.c*************************************/
633ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
634827bd09bSSatish Balay {
6353fdc5746SBarry Smith   PetscFunctionBegin;
6362fa5cd67SKarl Rupp   while (n--) {
6372fa5cd67SKarl Rupp     *arg1 = MIN_FABS(*arg1,*arg2);
6382fa5cd67SKarl Rupp     arg1++;
6392fa5cd67SKarl Rupp     arg2++;
6402fa5cd67SKarl Rupp   }
6413fdc5746SBarry Smith   PetscFunctionReturn(0);
642827bd09bSSatish Balay }
643827bd09bSSatish Balay 
6447b1ae94cSBarry Smith /*********************************ivec.c*************************************/
645ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
646827bd09bSSatish Balay {
6473fdc5746SBarry Smith   PetscFunctionBegin;
6482fa5cd67SKarl Rupp   while (n--) {
6492fa5cd67SKarl Rupp     *arg1 = EXISTS(*arg1,*arg2);
6502fa5cd67SKarl Rupp     arg1++;
6512fa5cd67SKarl Rupp     arg2++;
6522fa5cd67SKarl Rupp   }
6533fdc5746SBarry Smith   PetscFunctionReturn(0);
654827bd09bSSatish Balay }
655827bd09bSSatish Balay 
6567b1ae94cSBarry Smith /***********************************ivec.c*************************************/
657ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  PetscInt n,  PetscInt *arg3)
658827bd09bSSatish Balay {
65952f87cdaSBarry Smith   PetscInt i, j, type;
660827bd09bSSatish Balay 
6613fdc5746SBarry Smith   PetscFunctionBegin;
662827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
663db4deed7SKarl Rupp   for (i=0; i<n;) {
664db4deed7SKarl Rupp 
665827bd09bSSatish Balay     /* clump 'em for now */
666827bd09bSSatish Balay     j    =i+1;
667827bd09bSSatish Balay     type = arg3[i];
6682fa5cd67SKarl Rupp     while ((j<n)&&(arg3[j]==type)) j++;
669827bd09bSSatish Balay 
670827bd09bSSatish Balay     /* how many together */
671827bd09bSSatish Balay     j -= i;
672827bd09bSSatish Balay 
673827bd09bSSatish Balay     /* call appropriate ivec function */
6742fa5cd67SKarl Rupp     if (type == GL_MAX)          PCTFS_rvec_max(arg1,arg2,j);
6752fa5cd67SKarl Rupp     else if (type == GL_MIN)     PCTFS_rvec_min(arg1,arg2,j);
6762fa5cd67SKarl Rupp     else if (type == GL_MULT)    PCTFS_rvec_mult(arg1,arg2,j);
6772fa5cd67SKarl Rupp     else if (type == GL_ADD)     PCTFS_rvec_add(arg1,arg2,j);
6782fa5cd67SKarl Rupp     else if (type == GL_MAX_ABS) PCTFS_rvec_max_abs(arg1,arg2,j);
6792fa5cd67SKarl Rupp     else if (type == GL_MIN_ABS) PCTFS_rvec_min_abs(arg1,arg2,j);
6802fa5cd67SKarl Rupp     else if (type == GL_EXISTS)  PCTFS_rvec_exists(arg1,arg2,j);
681ca8e9878SJed Brown     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!");
682827bd09bSSatish Balay 
683827bd09bSSatish Balay     arg1+=j; arg2+=j; i+=j;
684827bd09bSSatish Balay   }
6853fdc5746SBarry Smith   PetscFunctionReturn(0);
686827bd09bSSatish Balay }
687827bd09bSSatish Balay 
6887b1ae94cSBarry Smith /***********************************ivec.c*************************************/
689ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr(PetscInt type)
690827bd09bSSatish Balay {
6912fa5cd67SKarl Rupp   if (type == NON_UNIFORM)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_non_uniform);
6922fa5cd67SKarl Rupp   else if (type == GL_MAX)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max);
6932fa5cd67SKarl Rupp   else if (type == GL_MIN)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min);
6942fa5cd67SKarl Rupp   else if (type == GL_MULT)    return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_mult);
6952fa5cd67SKarl Rupp   else if (type == GL_ADD)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_add);
6962fa5cd67SKarl Rupp   else if (type == GL_MAX_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max_abs);
6972fa5cd67SKarl Rupp   else if (type == GL_MIN_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min_abs);
6982fa5cd67SKarl Rupp   else if (type == GL_EXISTS)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_exists);
699827bd09bSSatish Balay 
700827bd09bSSatish Balay   /* catch all ... not good if we get here */
701827bd09bSSatish Balay   return(NULL);
702827bd09bSSatish Balay }
703827bd09bSSatish Balay 
704