xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 9895aa37ac365bac650f6bd8bf977519f7222510)
1827bd09bSSatish Balay 
2*9895aa37SBarry Smith 
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 
18c6db04a5SJed Brown #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*************************************/
30ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n)
31827bd09bSSatish Balay {
322fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
33827bd09bSSatish Balay   return(arg1);
34827bd09bSSatish Balay }
35827bd09bSSatish Balay 
367b1ae94cSBarry Smith /***********************************ivec.c*************************************/
37ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n)
38827bd09bSSatish Balay {
393fdc5746SBarry Smith   PetscFunctionBegin;
402fa5cd67SKarl Rupp   while (n--) *arg1++ = 0;
413fdc5746SBarry Smith   PetscFunctionReturn(0);
42827bd09bSSatish Balay }
43827bd09bSSatish Balay 
447b1ae94cSBarry Smith /***********************************ivec.c*************************************/
45ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n)
46827bd09bSSatish Balay {
473fdc5746SBarry Smith   PetscFunctionBegin;
482fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
493fdc5746SBarry Smith   PetscFunctionReturn(0);
50827bd09bSSatish Balay }
51827bd09bSSatish Balay 
527b1ae94cSBarry Smith /***********************************ivec.c*************************************/
53ca8e9878SJed Brown PetscErrorCode PCTFS_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*************************************/
61ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
62827bd09bSSatish Balay {
633fdc5746SBarry Smith   PetscFunctionBegin;
642fa5cd67SKarl Rupp   while (n--) {
652fa5cd67SKarl Rupp     *(arg1) = PetscMin(*arg1,*arg2);
662fa5cd67SKarl Rupp     arg1++;
672fa5cd67SKarl Rupp     arg2++;
682fa5cd67SKarl Rupp   }
693fdc5746SBarry Smith   PetscFunctionReturn(0);
70827bd09bSSatish Balay }
71827bd09bSSatish Balay 
727b1ae94cSBarry Smith /***********************************ivec.c*************************************/
73ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
74827bd09bSSatish Balay {
753fdc5746SBarry Smith   PetscFunctionBegin;
762fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
773fdc5746SBarry Smith   PetscFunctionReturn(0);
78827bd09bSSatish Balay }
79827bd09bSSatish Balay 
807b1ae94cSBarry Smith /***********************************ivec.c*************************************/
81ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
82827bd09bSSatish Balay {
833fdc5746SBarry Smith   PetscFunctionBegin;
842fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
853fdc5746SBarry Smith   PetscFunctionReturn(0);
86827bd09bSSatish Balay }
87827bd09bSSatish Balay 
887b1ae94cSBarry Smith /***********************************ivec.c*************************************/
89ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
90827bd09bSSatish Balay {
913fdc5746SBarry Smith   PetscFunctionBegin;
922fa5cd67SKarl Rupp   while (n--) {
932fa5cd67SKarl Rupp     *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2));
942fa5cd67SKarl Rupp     arg1++;
952fa5cd67SKarl Rupp     arg2++;
962fa5cd67SKarl Rupp   }
973fdc5746SBarry Smith   PetscFunctionReturn(0);
98827bd09bSSatish Balay }
99827bd09bSSatish Balay 
1007b1ae94cSBarry Smith /***********************************ivec.c*************************************/
101ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
102827bd09bSSatish Balay {
1033fdc5746SBarry Smith   PetscFunctionBegin;
1042fa5cd67SKarl Rupp   while (n--) *arg1++ ^= *arg2++;
1053fdc5746SBarry Smith   PetscFunctionReturn(0);
106827bd09bSSatish Balay }
107827bd09bSSatish Balay 
1087b1ae94cSBarry Smith /***********************************ivec.c*************************************/
109ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
110827bd09bSSatish Balay {
1113fdc5746SBarry Smith   PetscFunctionBegin;
1122fa5cd67SKarl Rupp   while (n--) *arg1++ |= *arg2++;
1133fdc5746SBarry Smith   PetscFunctionReturn(0);
114827bd09bSSatish Balay }
115827bd09bSSatish Balay 
1167b1ae94cSBarry Smith /***********************************ivec.c*************************************/
117ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
118827bd09bSSatish Balay {
1193fdc5746SBarry Smith   PetscFunctionBegin;
1202fa5cd67SKarl Rupp   while (n--) {
1212fa5cd67SKarl Rupp     *arg1 = (*arg1 || *arg2);
1222fa5cd67SKarl Rupp     arg1++;
1232fa5cd67SKarl Rupp     arg2++;
1242fa5cd67SKarl Rupp   }
1253fdc5746SBarry Smith   PetscFunctionReturn(0);
126827bd09bSSatish Balay }
127827bd09bSSatish Balay 
1287b1ae94cSBarry Smith /***********************************ivec.c*************************************/
129ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
130827bd09bSSatish Balay {
1313fdc5746SBarry Smith   PetscFunctionBegin;
1322fa5cd67SKarl Rupp   while (n--) *arg1++ &= *arg2++;
1333fdc5746SBarry Smith   PetscFunctionReturn(0);
134827bd09bSSatish Balay }
135827bd09bSSatish Balay 
1367b1ae94cSBarry Smith /***********************************ivec.c*************************************/
137ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
138827bd09bSSatish Balay {
1393fdc5746SBarry Smith   PetscFunctionBegin;
1402fa5cd67SKarl Rupp   while (n--) {
1412fa5cd67SKarl Rupp     *arg1 = (*arg1 && *arg2);
1422fa5cd67SKarl Rupp     arg1++;
1432fa5cd67SKarl Rupp     arg2++;
1442fa5cd67SKarl Rupp   }
1453fdc5746SBarry Smith   PetscFunctionReturn(0);
146827bd09bSSatish Balay }
147827bd09bSSatish Balay 
1487b1ae94cSBarry Smith /***********************************ivec.c*************************************/
149ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1,  PetscInt *arg2,  PetscInt *arg3, PetscInt n)
150827bd09bSSatish Balay {
1513fdc5746SBarry Smith   PetscFunctionBegin;
1522fa5cd67SKarl Rupp   while (n--) *arg1++ = (*arg2++ & *arg3++);
1533fdc5746SBarry Smith   PetscFunctionReturn(0);
154827bd09bSSatish Balay }
155827bd09bSSatish Balay 
1567b1ae94cSBarry Smith /***********************************ivec.c*************************************/
157ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1,  PetscInt n)
158827bd09bSSatish Balay {
15952f87cdaSBarry Smith   PetscInt tmp = 0;
1602fa5cd67SKarl Rupp   while (n--) tmp += *arg1++;
161827bd09bSSatish Balay   return(tmp);
162827bd09bSSatish Balay }
163827bd09bSSatish Balay 
1647b1ae94cSBarry Smith /***********************************ivec.c*************************************/
165ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2,  PetscInt n,  PetscInt *arg3)
166827bd09bSSatish Balay {
16752f87cdaSBarry Smith   PetscInt i, j, type;
168827bd09bSSatish Balay 
1693fdc5746SBarry Smith   PetscFunctionBegin;
170827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
171db4deed7SKarl Rupp   for (i=0; i<n; ) {
172827bd09bSSatish Balay     /* clump 'em for now */
173827bd09bSSatish Balay     j    =i+1;
174827bd09bSSatish Balay     type = arg3[i];
1752fa5cd67SKarl Rupp     while ((j<n)&&(arg3[j]==type)) j++;
176827bd09bSSatish Balay 
177827bd09bSSatish Balay     /* how many together */
178827bd09bSSatish Balay     j -= i;
179827bd09bSSatish Balay 
180827bd09bSSatish Balay     /* call appropriate ivec function */
1812fa5cd67SKarl Rupp     if (type == GL_MAX)        PCTFS_ivec_max(arg1,arg2,j);
1822fa5cd67SKarl Rupp     else if (type == GL_MIN)   PCTFS_ivec_min(arg1,arg2,j);
1832fa5cd67SKarl Rupp     else if (type == GL_MULT)  PCTFS_ivec_mult(arg1,arg2,j);
1842fa5cd67SKarl Rupp     else if (type == GL_ADD)   PCTFS_ivec_add(arg1,arg2,j);
1852fa5cd67SKarl Rupp     else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j);
1862fa5cd67SKarl Rupp     else if (type == GL_B_OR)  PCTFS_ivec_or(arg1,arg2,j);
1872fa5cd67SKarl Rupp     else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j);
1882fa5cd67SKarl Rupp     else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j);
1892fa5cd67SKarl Rupp     else if (type == GL_L_OR)  PCTFS_ivec_lor(arg1,arg2,j);
1902fa5cd67SKarl Rupp     else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j);
191db4deed7SKarl Rupp     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_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*************************************/
199ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type)
200827bd09bSSatish Balay {
2012fa5cd67SKarl Rupp   if (type == NON_UNIFORM)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform);
2022fa5cd67SKarl Rupp   else if (type == GL_MAX)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max);
2032fa5cd67SKarl Rupp   else if (type == GL_MIN)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min);
2042fa5cd67SKarl Rupp   else if (type == GL_MULT)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult);
2052fa5cd67SKarl Rupp   else if (type == GL_ADD)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add);
2062fa5cd67SKarl Rupp   else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor);
2072fa5cd67SKarl Rupp   else if (type == GL_B_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or);
2082fa5cd67SKarl Rupp   else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and);
2092fa5cd67SKarl Rupp   else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor);
2102fa5cd67SKarl Rupp   else if (type == GL_L_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor);
2112fa5cd67SKarl Rupp   else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land);
212827bd09bSSatish Balay 
213827bd09bSSatish Balay   /* catch all ... not good if we get here */
214827bd09bSSatish Balay   return(NULL);
215827bd09bSSatish Balay }
216827bd09bSSatish Balay 
2177b1ae94cSBarry Smith /******************************************************************************/
218ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar,  PetscInt size)
219827bd09bSSatish Balay {
22052f87cdaSBarry Smith   PetscInt *pi, *pj, temp;
22152f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**) offset_stack;
22252f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
223827bd09bSSatish Balay 
224827bd09bSSatish Balay 
225827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
226827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
227827bd09bSSatish Balay   size--;
228827bd09bSSatish Balay 
229827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
230db4deed7SKarl Rupp   for (;; ) {
231827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
232db4deed7SKarl Rupp     if (size > SORT_OPT) {
233827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
234827bd09bSSatish Balay       pi = ar+1;
235827bd09bSSatish Balay       pj = ar+size;
236827bd09bSSatish Balay 
237827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
238827bd09bSSatish Balay       SWAP(*(ar+(size>>1)),*pi)
239827bd09bSSatish Balay 
240827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
241827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
242db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) }
243db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) }
244db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) }
245827bd09bSSatish Balay 
246827bd09bSSatish Balay       /* partition about pivot_value ...                              */
247827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
248db4deed7SKarl Rupp       for (;; ) {
249827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
250827bd09bSSatish Balay         do pi++; while (*pi<*ar);
251827bd09bSSatish Balay         do pj--; while (*pj>*ar);
252827bd09bSSatish Balay 
253827bd09bSSatish Balay         /* if we've crossed we're done */
254827bd09bSSatish Balay         if (pj<pi) break;
255827bd09bSSatish Balay 
256827bd09bSSatish Balay         /* else swap */
257827bd09bSSatish Balay         SWAP(*pi,*pj)
258827bd09bSSatish Balay       }
259827bd09bSSatish Balay 
260827bd09bSSatish Balay       /* place pivot_value in it's correct location */
261827bd09bSSatish Balay       SWAP(*ar,*pj)
262827bd09bSSatish Balay 
263827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
264ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!");
265827bd09bSSatish Balay 
266827bd09bSSatish Balay       /* push right hand child iff length > 1 */
267db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
268827bd09bSSatish Balay         *(top_a++) = pi;
269827bd09bSSatish Balay         size      -= *top_s+2;
270827bd09bSSatish Balay         top_s++;
2712fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
272db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
273827bd09bSSatish Balay         ar   = *(--top_a);
274827bd09bSSatish Balay         size = *(--top_s);
275827bd09bSSatish Balay       }
276db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
277827bd09bSSatish Balay 
278827bd09bSSatish Balay       /* insertion sort for bottom */
279db4deed7SKarl Rupp       for (pj=ar+1; pj<=ar+size; pj++) {
280827bd09bSSatish Balay         temp = *pj;
281db4deed7SKarl Rupp         for (pi=pj-1; pi>=ar; pi--) {
282827bd09bSSatish Balay           if (*pi <= temp) break;
283827bd09bSSatish Balay           *(pi+1)=*pi;
284827bd09bSSatish Balay         }
285827bd09bSSatish Balay         *(pi+1)=temp;
286827bd09bSSatish Balay       }
287827bd09bSSatish Balay 
288827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
2893fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
290827bd09bSSatish Balay 
291827bd09bSSatish Balay       /* else pop another list from the stack */
292827bd09bSSatish Balay       ar   = *(--top_a);
293827bd09bSSatish Balay       size = *(--top_s);
294827bd09bSSatish Balay     }
295827bd09bSSatish Balay   }
2963fdc5746SBarry Smith   PetscFunctionReturn(0);
297827bd09bSSatish Balay }
298827bd09bSSatish Balay 
2997b1ae94cSBarry Smith /******************************************************************************/
300ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar,  PetscInt *ar2,  PetscInt size)
301827bd09bSSatish Balay {
30252f87cdaSBarry Smith   PetscInt *pi, *pj, temp, temp2;
30352f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
30452f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
30552f87cdaSBarry Smith   PetscInt *pi2, *pj2;
30652f87cdaSBarry Smith   PetscInt mid;
307827bd09bSSatish Balay 
3083fdc5746SBarry Smith   PetscFunctionBegin;
309827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
310827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
311827bd09bSSatish Balay   size--;
312827bd09bSSatish Balay 
313827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
314db4deed7SKarl Rupp   for (;; ) {
315db4deed7SKarl Rupp 
316827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
317db4deed7SKarl Rupp     if (size > SORT_OPT) {
318db4deed7SKarl Rupp 
319827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
320827bd09bSSatish Balay       mid = size>>1;
321827bd09bSSatish Balay       pi  = ar+1;
322827bd09bSSatish Balay       pj  = ar+mid;
323827bd09bSSatish Balay       pi2 = ar2+1;
324827bd09bSSatish Balay       pj2 = ar2+mid;
325827bd09bSSatish Balay 
326827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
327827bd09bSSatish Balay       SWAP(*pi,*pj)
328827bd09bSSatish Balay       SWAP(*pi2,*pj2)
329827bd09bSSatish Balay 
330827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
331827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
332827bd09bSSatish Balay       pj  = ar+size;
333827bd09bSSatish Balay       pj2 = ar2+size;
334db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) }
335db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) }
336db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) }
337827bd09bSSatish Balay 
338827bd09bSSatish Balay       /* partition about pivot_value ...                              */
339827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
340db4deed7SKarl Rupp       for (;; ) {
341827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
342827bd09bSSatish Balay         do { pi++; pi2++; } while (*pi<*ar);
343827bd09bSSatish Balay         do { pj--; pj2--; } while (*pj>*ar);
344827bd09bSSatish Balay 
345827bd09bSSatish Balay         /* if we've crossed we're done */
346827bd09bSSatish Balay         if (pj<pi) break;
347827bd09bSSatish Balay 
348827bd09bSSatish Balay         /* else swap */
349827bd09bSSatish Balay         SWAP(*pi,*pj)
350827bd09bSSatish Balay         SWAP(*pi2,*pj2)
351827bd09bSSatish Balay       }
352827bd09bSSatish Balay 
353827bd09bSSatish Balay       /* place pivot_value in it's correct location */
354827bd09bSSatish Balay       SWAP(*ar,*pj)
355827bd09bSSatish Balay       SWAP(*ar2,*pj2)
356827bd09bSSatish Balay 
357827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
358ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!");
359827bd09bSSatish Balay 
360827bd09bSSatish Balay       /* push right hand child iff length > 1 */
361db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
362827bd09bSSatish Balay         *(top_a++) = pi;
363827bd09bSSatish Balay         *(top_a++) = pi2;
364827bd09bSSatish Balay         size      -= *top_s+2;
365827bd09bSSatish Balay         top_s++;
3662fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
367db4deed7SKarl Rupp       else {  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
368827bd09bSSatish Balay         ar2  = *(--top_a);
369827bd09bSSatish Balay         ar   = *(--top_a);
370827bd09bSSatish Balay         size = *(--top_s);
371827bd09bSSatish Balay       }
372db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
373827bd09bSSatish Balay 
374827bd09bSSatish Balay       /* insertion sort for bottom */
375db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
376827bd09bSSatish Balay         temp  = *pj;
377827bd09bSSatish Balay         temp2 = *pj2;
378db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
379827bd09bSSatish Balay           if (*pi <= temp) break;
380827bd09bSSatish Balay           *(pi+1) =*pi;
381827bd09bSSatish Balay           *(pi2+1)=*pi2;
382827bd09bSSatish Balay         }
383827bd09bSSatish Balay         *(pi+1) =temp;
384827bd09bSSatish Balay         *(pi2+1)=temp2;
385827bd09bSSatish Balay       }
386827bd09bSSatish Balay 
387827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
3883fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
389827bd09bSSatish Balay 
390827bd09bSSatish Balay       /* else pop another list from the stack */
391827bd09bSSatish Balay       ar2  = *(--top_a);
392827bd09bSSatish Balay       ar   = *(--top_a);
393827bd09bSSatish Balay       size = *(--top_s);
394827bd09bSSatish Balay     }
395827bd09bSSatish Balay   }
3963fdc5746SBarry Smith   PetscFunctionReturn(0);
397827bd09bSSatish Balay }
398827bd09bSSatish Balay 
3997b1ae94cSBarry Smith /******************************************************************************/
400ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar,  PetscInt **ar2, PetscInt size)
401827bd09bSSatish Balay {
40252f87cdaSBarry Smith   PetscInt *pi, *pj, temp, *ptr;
40352f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
40452f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
40552f87cdaSBarry Smith   PetscInt **pi2, **pj2;
40652f87cdaSBarry Smith   PetscInt mid;
407827bd09bSSatish Balay 
4083fdc5746SBarry Smith   PetscFunctionBegin;
409827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
410827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
411827bd09bSSatish Balay   size--;
412827bd09bSSatish Balay 
413827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
414db4deed7SKarl Rupp   for (;; ) {
415db4deed7SKarl Rupp 
416827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
417db4deed7SKarl Rupp     if (size > SORT_OPT) {
418db4deed7SKarl Rupp 
419827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
420827bd09bSSatish Balay       mid = size>>1;
421827bd09bSSatish Balay       pi  = ar+1;
422827bd09bSSatish Balay       pj  = ar+mid;
423827bd09bSSatish Balay       pi2 = ar2+1;
424827bd09bSSatish Balay       pj2 = ar2+mid;
425827bd09bSSatish Balay 
426827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
427827bd09bSSatish Balay       SWAP(*pi,*pj)
428827bd09bSSatish Balay       P_SWAP(*pi2,*pj2)
429827bd09bSSatish Balay 
430827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
431827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
432827bd09bSSatish Balay       pj  = ar+size;
433827bd09bSSatish Balay       pj2 = ar2+size;
434db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) }
435db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) }
436db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) }
437827bd09bSSatish Balay 
438827bd09bSSatish Balay       /* partition about pivot_value ...                              */
439827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
440db4deed7SKarl Rupp       for (;; ) {
441db4deed7SKarl Rupp 
442827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
443827bd09bSSatish Balay         do {pi++; pi2++;} while (*pi<*ar);
444827bd09bSSatish Balay         do {pj--; pj2--;} while (*pj>*ar);
445827bd09bSSatish Balay 
446827bd09bSSatish Balay         /* if we've crossed we're done */
447827bd09bSSatish Balay         if (pj<pi) break;
448827bd09bSSatish Balay 
449827bd09bSSatish Balay         /* else swap */
450827bd09bSSatish Balay         SWAP(*pi,*pj)
451827bd09bSSatish Balay         P_SWAP(*pi2,*pj2)
452827bd09bSSatish Balay       }
453827bd09bSSatish Balay 
454827bd09bSSatish Balay       /* place pivot_value in it's correct location */
455827bd09bSSatish Balay       SWAP(*ar,*pj)
456827bd09bSSatish Balay       P_SWAP(*ar2,*pj2)
457827bd09bSSatish Balay 
458827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
459ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
460827bd09bSSatish Balay 
461827bd09bSSatish Balay       /* push right hand child iff length > 1 */
462db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
463827bd09bSSatish Balay         *(top_a++) = pi;
46452f87cdaSBarry Smith         *(top_a++) = (PetscInt*) pi2;
465827bd09bSSatish Balay         size      -= *top_s+2;
466827bd09bSSatish Balay         top_s++;
4672fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
468db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
46952f87cdaSBarry Smith         ar2  = (PetscInt**) *(--top_a);
470827bd09bSSatish Balay         ar   = *(--top_a);
471827bd09bSSatish Balay         size = *(--top_s);
472827bd09bSSatish Balay       }
4732fa5cd67SKarl Rupp     } else  { /* else sort small list directly then pop another off stack */
474827bd09bSSatish Balay       /* insertion sort for bottom */
475db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
476827bd09bSSatish Balay         temp = *pj;
477827bd09bSSatish Balay         ptr  = *pj2;
478db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
479827bd09bSSatish Balay           if (*pi <= temp) break;
480827bd09bSSatish Balay           *(pi+1) =*pi;
481827bd09bSSatish Balay           *(pi2+1)=*pi2;
482827bd09bSSatish Balay         }
483827bd09bSSatish Balay         *(pi+1) =temp;
484827bd09bSSatish Balay         *(pi2+1)=ptr;
485827bd09bSSatish Balay       }
486827bd09bSSatish Balay 
487827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
4883fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
489827bd09bSSatish Balay 
490827bd09bSSatish Balay       /* else pop another list from the stack */
49152f87cdaSBarry Smith       ar2  = (PetscInt**)*(--top_a);
492827bd09bSSatish Balay       ar   = *(--top_a);
493827bd09bSSatish Balay       size = *(--top_s);
494827bd09bSSatish Balay     }
495827bd09bSSatish Balay   }
4963fdc5746SBarry Smith   PetscFunctionReturn(0);
497827bd09bSSatish Balay }
498827bd09bSSatish Balay 
4997b1ae94cSBarry Smith /******************************************************************************/
500ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
501827bd09bSSatish Balay {
5023fdc5746SBarry Smith   PetscFunctionBegin;
503e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
504ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size);
505ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
506e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
507ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size);
508ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
509ca8e9878SJed Brown   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!");
5103fdc5746SBarry Smith   PetscFunctionReturn(0);
511827bd09bSSatish Balay }
512827bd09bSSatish Balay 
5137b1ae94cSBarry Smith /***********************************ivec.c*************************************/
514ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item,  PetscInt *list,  PetscInt n)
515827bd09bSSatish Balay {
51652f87cdaSBarry Smith   PetscInt tmp = n-1;
5175fd66863SKarl Rupp 
5183fdc5746SBarry Smith   PetscFunctionBegin;
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 
704827bd09bSSatish Balay 
705827bd09bSSatish Balay 
706827bd09bSSatish Balay 
707827bd09bSSatish Balay 
708827bd09bSSatish Balay 
709