xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 2fa5cd679192b9b390e47ae2d0650965e6b1d9fa)
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*************************************/
29ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n)
30827bd09bSSatish Balay {
31*2fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
32827bd09bSSatish Balay   return(arg1);
33827bd09bSSatish Balay }
34827bd09bSSatish Balay 
357b1ae94cSBarry Smith /***********************************ivec.c*************************************/
36ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n)
37827bd09bSSatish Balay {
383fdc5746SBarry Smith   PetscFunctionBegin;
39*2fa5cd67SKarl Rupp   while (n--) *arg1++ = 0;
403fdc5746SBarry Smith   PetscFunctionReturn(0);
41827bd09bSSatish Balay }
42827bd09bSSatish Balay 
437b1ae94cSBarry Smith /***********************************ivec.c*************************************/
44ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n)
45827bd09bSSatish Balay {
463fdc5746SBarry Smith   PetscFunctionBegin;
47*2fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
483fdc5746SBarry Smith   PetscFunctionReturn(0);
49827bd09bSSatish Balay }
50827bd09bSSatish Balay 
517b1ae94cSBarry Smith /***********************************ivec.c*************************************/
52ca8e9878SJed 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*************************************/
60ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
61827bd09bSSatish Balay {
623fdc5746SBarry Smith   PetscFunctionBegin;
63*2fa5cd67SKarl Rupp   while (n--) {
64*2fa5cd67SKarl Rupp     *(arg1) = PetscMin(*arg1,*arg2);
65*2fa5cd67SKarl Rupp     arg1++;
66*2fa5cd67SKarl Rupp     arg2++;
67*2fa5cd67SKarl Rupp   }
683fdc5746SBarry Smith   PetscFunctionReturn(0);
69827bd09bSSatish Balay }
70827bd09bSSatish Balay 
717b1ae94cSBarry Smith /***********************************ivec.c*************************************/
72ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
73827bd09bSSatish Balay {
743fdc5746SBarry Smith   PetscFunctionBegin;
75*2fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
763fdc5746SBarry Smith   PetscFunctionReturn(0);
77827bd09bSSatish Balay }
78827bd09bSSatish Balay 
797b1ae94cSBarry Smith /***********************************ivec.c*************************************/
80ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
81827bd09bSSatish Balay {
823fdc5746SBarry Smith   PetscFunctionBegin;
83*2fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
843fdc5746SBarry Smith   PetscFunctionReturn(0);
85827bd09bSSatish Balay }
86827bd09bSSatish Balay 
877b1ae94cSBarry Smith /***********************************ivec.c*************************************/
88ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
89827bd09bSSatish Balay {
903fdc5746SBarry Smith   PetscFunctionBegin;
91*2fa5cd67SKarl Rupp   while (n--) {
92*2fa5cd67SKarl Rupp     *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2));
93*2fa5cd67SKarl Rupp     arg1++;
94*2fa5cd67SKarl Rupp     arg2++;
95*2fa5cd67SKarl Rupp   }
963fdc5746SBarry Smith   PetscFunctionReturn(0);
97827bd09bSSatish Balay }
98827bd09bSSatish Balay 
997b1ae94cSBarry Smith /***********************************ivec.c*************************************/
100ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
101827bd09bSSatish Balay {
1023fdc5746SBarry Smith   PetscFunctionBegin;
103*2fa5cd67SKarl Rupp   while (n--) *arg1++ ^= *arg2++;
1043fdc5746SBarry Smith   PetscFunctionReturn(0);
105827bd09bSSatish Balay }
106827bd09bSSatish Balay 
1077b1ae94cSBarry Smith /***********************************ivec.c*************************************/
108ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
109827bd09bSSatish Balay {
1103fdc5746SBarry Smith   PetscFunctionBegin;
111*2fa5cd67SKarl Rupp   while (n--) *arg1++ |= *arg2++;
1123fdc5746SBarry Smith   PetscFunctionReturn(0);
113827bd09bSSatish Balay }
114827bd09bSSatish Balay 
1157b1ae94cSBarry Smith /***********************************ivec.c*************************************/
116ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
117827bd09bSSatish Balay {
1183fdc5746SBarry Smith   PetscFunctionBegin;
119*2fa5cd67SKarl Rupp   while (n--) {
120*2fa5cd67SKarl Rupp     *arg1 = (*arg1 || *arg2);
121*2fa5cd67SKarl Rupp     arg1++;
122*2fa5cd67SKarl Rupp     arg2++;
123*2fa5cd67SKarl Rupp   }
1243fdc5746SBarry Smith   PetscFunctionReturn(0);
125827bd09bSSatish Balay }
126827bd09bSSatish Balay 
1277b1ae94cSBarry Smith /***********************************ivec.c*************************************/
128ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
129827bd09bSSatish Balay {
1303fdc5746SBarry Smith   PetscFunctionBegin;
131*2fa5cd67SKarl Rupp   while (n--) *arg1++ &= *arg2++;
1323fdc5746SBarry Smith   PetscFunctionReturn(0);
133827bd09bSSatish Balay }
134827bd09bSSatish Balay 
1357b1ae94cSBarry Smith /***********************************ivec.c*************************************/
136ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1,  PetscInt *arg2,  PetscInt n)
137827bd09bSSatish Balay {
1383fdc5746SBarry Smith   PetscFunctionBegin;
139*2fa5cd67SKarl Rupp   while (n--) {
140*2fa5cd67SKarl Rupp     *arg1 = (*arg1 && *arg2);
141*2fa5cd67SKarl Rupp     arg1++;
142*2fa5cd67SKarl Rupp     arg2++;
143*2fa5cd67SKarl Rupp   }
1443fdc5746SBarry Smith   PetscFunctionReturn(0);
145827bd09bSSatish Balay }
146827bd09bSSatish Balay 
1477b1ae94cSBarry Smith /***********************************ivec.c*************************************/
148ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1,  PetscInt *arg2,  PetscInt *arg3, PetscInt n)
149827bd09bSSatish Balay {
1503fdc5746SBarry Smith   PetscFunctionBegin;
151*2fa5cd67SKarl Rupp   while (n--) *arg1++ = (*arg2++ & *arg3++);
1523fdc5746SBarry Smith   PetscFunctionReturn(0);
153827bd09bSSatish Balay }
154827bd09bSSatish Balay 
1557b1ae94cSBarry Smith /***********************************ivec.c*************************************/
156ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1,  PetscInt n)
157827bd09bSSatish Balay {
15852f87cdaSBarry Smith   PetscInt tmp = 0;
159*2fa5cd67SKarl Rupp   while (n--) tmp += *arg1++;
160827bd09bSSatish Balay   return(tmp);
161827bd09bSSatish Balay }
162827bd09bSSatish Balay 
1637b1ae94cSBarry Smith /***********************************ivec.c*************************************/
164ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2,  PetscInt n,  PetscInt *arg3)
165827bd09bSSatish Balay {
16652f87cdaSBarry Smith   PetscInt i, j, type;
167827bd09bSSatish Balay 
1683fdc5746SBarry Smith   PetscFunctionBegin;
169827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
170db4deed7SKarl Rupp   for (i=0; i<n; ) {
171827bd09bSSatish Balay     /* clump 'em for now */
172827bd09bSSatish Balay     j    =i+1;
173827bd09bSSatish Balay     type = arg3[i];
174*2fa5cd67SKarl Rupp     while ((j<n)&&(arg3[j]==type)) j++;
175827bd09bSSatish Balay 
176827bd09bSSatish Balay     /* how many together */
177827bd09bSSatish Balay     j -= i;
178827bd09bSSatish Balay 
179827bd09bSSatish Balay     /* call appropriate ivec function */
180*2fa5cd67SKarl Rupp     if (type == GL_MAX)        PCTFS_ivec_max(arg1,arg2,j);
181*2fa5cd67SKarl Rupp     else if (type == GL_MIN)   PCTFS_ivec_min(arg1,arg2,j);
182*2fa5cd67SKarl Rupp     else if (type == GL_MULT)  PCTFS_ivec_mult(arg1,arg2,j);
183*2fa5cd67SKarl Rupp     else if (type == GL_ADD)   PCTFS_ivec_add(arg1,arg2,j);
184*2fa5cd67SKarl Rupp     else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j);
185*2fa5cd67SKarl Rupp     else if (type == GL_B_OR)  PCTFS_ivec_or(arg1,arg2,j);
186*2fa5cd67SKarl Rupp     else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j);
187*2fa5cd67SKarl Rupp     else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j);
188*2fa5cd67SKarl Rupp     else if (type == GL_L_OR)  PCTFS_ivec_lor(arg1,arg2,j);
189*2fa5cd67SKarl Rupp     else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j);
190db4deed7SKarl Rupp     else 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*************************************/
198ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type)
199827bd09bSSatish Balay {
200*2fa5cd67SKarl Rupp   if (type == NON_UNIFORM)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform);
201*2fa5cd67SKarl Rupp   else if (type == GL_MAX)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max);
202*2fa5cd67SKarl Rupp   else if (type == GL_MIN)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min);
203*2fa5cd67SKarl Rupp   else if (type == GL_MULT)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult);
204*2fa5cd67SKarl Rupp   else if (type == GL_ADD)   return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add);
205*2fa5cd67SKarl Rupp   else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor);
206*2fa5cd67SKarl Rupp   else if (type == GL_B_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or);
207*2fa5cd67SKarl Rupp   else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and);
208*2fa5cd67SKarl Rupp   else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor);
209*2fa5cd67SKarl Rupp   else if (type == GL_L_OR)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor);
210*2fa5cd67SKarl Rupp   else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land);
211827bd09bSSatish Balay 
212827bd09bSSatish Balay   /* catch all ... not good if we get here */
213827bd09bSSatish Balay   return(NULL);
214827bd09bSSatish Balay }
215827bd09bSSatish Balay 
2167b1ae94cSBarry Smith /******************************************************************************/
217ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar,  PetscInt size)
218827bd09bSSatish Balay {
21952f87cdaSBarry Smith   PetscInt *pi, *pj, temp;
22052f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**) offset_stack;
22152f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
222827bd09bSSatish Balay 
223827bd09bSSatish Balay 
224827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
225827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
226827bd09bSSatish Balay   size--;
227827bd09bSSatish Balay 
228827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
229db4deed7SKarl Rupp   for (;; ) {
230827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
231db4deed7SKarl Rupp     if (size > SORT_OPT) {
232827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
233827bd09bSSatish Balay       pi = ar+1;
234827bd09bSSatish Balay       pj = ar+size;
235827bd09bSSatish Balay 
236827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
237827bd09bSSatish Balay       SWAP(*(ar+(size>>1)),*pi)
238827bd09bSSatish Balay 
239827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
240827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
241db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) }
242db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) }
243db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) }
244827bd09bSSatish Balay 
245827bd09bSSatish Balay       /* partition about pivot_value ...                              */
246827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
247db4deed7SKarl Rupp       for (;; ) {
248827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
249827bd09bSSatish Balay         do pi++; while (*pi<*ar);
250827bd09bSSatish Balay         do pj--; while (*pj>*ar);
251827bd09bSSatish Balay 
252827bd09bSSatish Balay         /* if we've crossed we're done */
253827bd09bSSatish Balay         if (pj<pi) break;
254827bd09bSSatish Balay 
255827bd09bSSatish Balay         /* else swap */
256827bd09bSSatish Balay         SWAP(*pi,*pj)
257827bd09bSSatish Balay       }
258827bd09bSSatish Balay 
259827bd09bSSatish Balay       /* place pivot_value in it's correct location */
260827bd09bSSatish Balay       SWAP(*ar,*pj)
261827bd09bSSatish Balay 
262827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
263ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!");
264827bd09bSSatish Balay 
265827bd09bSSatish Balay       /* push right hand child iff length > 1 */
266db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
267827bd09bSSatish Balay         *(top_a++) = pi;
268827bd09bSSatish Balay         size      -= *top_s+2;
269827bd09bSSatish Balay         top_s++;
270*2fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
271db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
272827bd09bSSatish Balay         ar   = *(--top_a);
273827bd09bSSatish Balay         size = *(--top_s);
274827bd09bSSatish Balay       }
275db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
276827bd09bSSatish Balay 
277827bd09bSSatish Balay       /* insertion sort for bottom */
278db4deed7SKarl Rupp       for (pj=ar+1; pj<=ar+size; pj++) {
279827bd09bSSatish Balay         temp = *pj;
280db4deed7SKarl Rupp         for (pi=pj-1; pi>=ar; pi--) {
281827bd09bSSatish Balay           if (*pi <= temp) break;
282827bd09bSSatish Balay           *(pi+1)=*pi;
283827bd09bSSatish Balay         }
284827bd09bSSatish Balay         *(pi+1)=temp;
285827bd09bSSatish Balay       }
286827bd09bSSatish Balay 
287827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
2883fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
289827bd09bSSatish Balay 
290827bd09bSSatish Balay       /* else pop another list from the stack */
291827bd09bSSatish Balay       ar   = *(--top_a);
292827bd09bSSatish Balay       size = *(--top_s);
293827bd09bSSatish Balay     }
294827bd09bSSatish Balay   }
2953fdc5746SBarry Smith   PetscFunctionReturn(0);
296827bd09bSSatish Balay }
297827bd09bSSatish Balay 
2987b1ae94cSBarry Smith /******************************************************************************/
299ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar,  PetscInt *ar2,  PetscInt size)
300827bd09bSSatish Balay {
30152f87cdaSBarry Smith   PetscInt *pi, *pj, temp, temp2;
30252f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
30352f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
30452f87cdaSBarry Smith   PetscInt *pi2, *pj2;
30552f87cdaSBarry Smith   PetscInt mid;
306827bd09bSSatish Balay 
3073fdc5746SBarry Smith   PetscFunctionBegin;
308827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
309827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
310827bd09bSSatish Balay   size--;
311827bd09bSSatish Balay 
312827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
313db4deed7SKarl Rupp   for (;; ) {
314db4deed7SKarl Rupp 
315827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
316db4deed7SKarl Rupp     if (size > SORT_OPT) {
317db4deed7SKarl Rupp 
318827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
319827bd09bSSatish Balay       mid = size>>1;
320827bd09bSSatish Balay       pi  = ar+1;
321827bd09bSSatish Balay       pj  = ar+mid;
322827bd09bSSatish Balay       pi2 = ar2+1;
323827bd09bSSatish Balay       pj2 = ar2+mid;
324827bd09bSSatish Balay 
325827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
326827bd09bSSatish Balay       SWAP(*pi,*pj)
327827bd09bSSatish Balay       SWAP(*pi2,*pj2)
328827bd09bSSatish Balay 
329827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
330827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
331827bd09bSSatish Balay       pj  = ar+size;
332827bd09bSSatish Balay       pj2 = ar2+size;
333db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) }
334db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) }
335db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) }
336827bd09bSSatish Balay 
337827bd09bSSatish Balay       /* partition about pivot_value ...                              */
338827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
339db4deed7SKarl Rupp       for (;; ) {
340827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
341827bd09bSSatish Balay         do { pi++; pi2++; } while (*pi<*ar);
342827bd09bSSatish Balay         do { pj--; pj2--; } while (*pj>*ar);
343827bd09bSSatish Balay 
344827bd09bSSatish Balay         /* if we've crossed we're done */
345827bd09bSSatish Balay         if (pj<pi) break;
346827bd09bSSatish Balay 
347827bd09bSSatish Balay         /* else swap */
348827bd09bSSatish Balay         SWAP(*pi,*pj)
349827bd09bSSatish Balay         SWAP(*pi2,*pj2)
350827bd09bSSatish Balay       }
351827bd09bSSatish Balay 
352827bd09bSSatish Balay       /* place pivot_value in it's correct location */
353827bd09bSSatish Balay       SWAP(*ar,*pj)
354827bd09bSSatish Balay       SWAP(*ar2,*pj2)
355827bd09bSSatish Balay 
356827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
357ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!");
358827bd09bSSatish Balay 
359827bd09bSSatish Balay       /* push right hand child iff length > 1 */
360db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
361827bd09bSSatish Balay         *(top_a++) = pi;
362827bd09bSSatish Balay         *(top_a++) = pi2;
363827bd09bSSatish Balay         size      -= *top_s+2;
364827bd09bSSatish Balay         top_s++;
365*2fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
366db4deed7SKarl Rupp       else {  /* might as well pop - note NR_OPT >=2 ==> we're ok! */
367827bd09bSSatish Balay         ar2  = *(--top_a);
368827bd09bSSatish Balay         ar   = *(--top_a);
369827bd09bSSatish Balay         size = *(--top_s);
370827bd09bSSatish Balay       }
371db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
372827bd09bSSatish Balay 
373827bd09bSSatish Balay       /* insertion sort for bottom */
374db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
375827bd09bSSatish Balay         temp  = *pj;
376827bd09bSSatish Balay         temp2 = *pj2;
377db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
378827bd09bSSatish Balay           if (*pi <= temp) break;
379827bd09bSSatish Balay           *(pi+1) =*pi;
380827bd09bSSatish Balay           *(pi2+1)=*pi2;
381827bd09bSSatish Balay         }
382827bd09bSSatish Balay         *(pi+1) =temp;
383827bd09bSSatish Balay         *(pi2+1)=temp2;
384827bd09bSSatish Balay       }
385827bd09bSSatish Balay 
386827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
3873fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
388827bd09bSSatish Balay 
389827bd09bSSatish Balay       /* else pop another list from the stack */
390827bd09bSSatish Balay       ar2  = *(--top_a);
391827bd09bSSatish Balay       ar   = *(--top_a);
392827bd09bSSatish Balay       size = *(--top_s);
393827bd09bSSatish Balay     }
394827bd09bSSatish Balay   }
3953fdc5746SBarry Smith   PetscFunctionReturn(0);
396827bd09bSSatish Balay }
397827bd09bSSatish Balay 
3987b1ae94cSBarry Smith /******************************************************************************/
399ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar,  PetscInt **ar2, PetscInt size)
400827bd09bSSatish Balay {
40152f87cdaSBarry Smith   PetscInt *pi, *pj, temp, *ptr;
40252f87cdaSBarry Smith   PetscInt **top_a = (PetscInt**)offset_stack;
40352f87cdaSBarry Smith   PetscInt *top_s  = size_stack, *bottom_s = size_stack;
40452f87cdaSBarry Smith   PetscInt **pi2, **pj2;
40552f87cdaSBarry Smith   PetscInt mid;
406827bd09bSSatish Balay 
4073fdc5746SBarry Smith   PetscFunctionBegin;
408827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
409827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
410827bd09bSSatish Balay   size--;
411827bd09bSSatish Balay 
412827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
413db4deed7SKarl Rupp   for (;; ) {
414db4deed7SKarl Rupp 
415827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
416db4deed7SKarl Rupp     if (size > SORT_OPT) {
417db4deed7SKarl Rupp 
418827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
419827bd09bSSatish Balay       mid = size>>1;
420827bd09bSSatish Balay       pi  = ar+1;
421827bd09bSSatish Balay       pj  = ar+mid;
422827bd09bSSatish Balay       pi2 = ar2+1;
423827bd09bSSatish Balay       pj2 = ar2+mid;
424827bd09bSSatish Balay 
425827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
426827bd09bSSatish Balay       SWAP(*pi,*pj)
427827bd09bSSatish Balay       P_SWAP(*pi2,*pj2)
428827bd09bSSatish Balay 
429827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
430827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
431827bd09bSSatish Balay       pj  = ar+size;
432827bd09bSSatish Balay       pj2 = ar2+size;
433db4deed7SKarl Rupp       if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) }
434db4deed7SKarl Rupp       if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) }
435db4deed7SKarl Rupp       else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) }
436827bd09bSSatish Balay 
437827bd09bSSatish Balay       /* partition about pivot_value ...                              */
438827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
439db4deed7SKarl Rupp       for (;; ) {
440db4deed7SKarl Rupp 
441827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
442827bd09bSSatish Balay         do {pi++; pi2++;} while (*pi<*ar);
443827bd09bSSatish Balay         do {pj--; pj2--;} while (*pj>*ar);
444827bd09bSSatish Balay 
445827bd09bSSatish Balay         /* if we've crossed we're done */
446827bd09bSSatish Balay         if (pj<pi) break;
447827bd09bSSatish Balay 
448827bd09bSSatish Balay         /* else swap */
449827bd09bSSatish Balay         SWAP(*pi,*pj)
450827bd09bSSatish Balay         P_SWAP(*pi2,*pj2)
451827bd09bSSatish Balay       }
452827bd09bSSatish Balay 
453827bd09bSSatish Balay       /* place pivot_value in it's correct location */
454827bd09bSSatish Balay       SWAP(*ar,*pj)
455827bd09bSSatish Balay       P_SWAP(*ar2,*pj2)
456827bd09bSSatish Balay 
457827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
458ca8e9878SJed Brown       if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
459827bd09bSSatish Balay 
460827bd09bSSatish Balay       /* push right hand child iff length > 1 */
461db4deed7SKarl Rupp       if ((*top_s = size-((PetscInt) (pi-ar)))) {
462827bd09bSSatish Balay         *(top_a++) = pi;
46352f87cdaSBarry Smith         *(top_a++) = (PetscInt*) pi2;
464827bd09bSSatish Balay         size      -= *top_s+2;
465827bd09bSSatish Balay         top_s++;
466*2fa5cd67SKarl Rupp       } else if (size -= *top_s+2) ;   /* set up for next loop iff there is something to do */
467db4deed7SKarl Rupp       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */
46852f87cdaSBarry Smith         ar2  = (PetscInt**) *(--top_a);
469827bd09bSSatish Balay         ar   = *(--top_a);
470827bd09bSSatish Balay         size = *(--top_s);
471827bd09bSSatish Balay       }
472*2fa5cd67SKarl Rupp     } else  { /* else sort small list directly then pop another off stack */
473827bd09bSSatish Balay       /* insertion sort for bottom */
474db4deed7SKarl Rupp       for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) {
475827bd09bSSatish Balay         temp = *pj;
476827bd09bSSatish Balay         ptr  = *pj2;
477db4deed7SKarl Rupp         for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) {
478827bd09bSSatish Balay           if (*pi <= temp) break;
479827bd09bSSatish Balay           *(pi+1) =*pi;
480827bd09bSSatish Balay           *(pi2+1)=*pi2;
481827bd09bSSatish Balay         }
482827bd09bSSatish Balay         *(pi+1) =temp;
483827bd09bSSatish Balay         *(pi2+1)=ptr;
484827bd09bSSatish Balay       }
485827bd09bSSatish Balay 
486827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
4873fdc5746SBarry Smith       if (top_s==bottom_s) PetscFunctionReturn(0);
488827bd09bSSatish Balay 
489827bd09bSSatish Balay       /* else pop another list from the stack */
49052f87cdaSBarry Smith       ar2  = (PetscInt**)*(--top_a);
491827bd09bSSatish Balay       ar   = *(--top_a);
492827bd09bSSatish Balay       size = *(--top_s);
493827bd09bSSatish Balay     }
494827bd09bSSatish Balay   }
4953fdc5746SBarry Smith   PetscFunctionReturn(0);
496827bd09bSSatish Balay }
497827bd09bSSatish Balay 
4987b1ae94cSBarry Smith /******************************************************************************/
499ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
500827bd09bSSatish Balay {
5013fdc5746SBarry Smith   PetscFunctionBegin;
502e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
503ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size);
504ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
505e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
506ca8e9878SJed Brown     if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size);
507ca8e9878SJed Brown     else PCTFS_ivec_sort((PetscInt*)ar1,size);
508ca8e9878SJed Brown   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!");
5093fdc5746SBarry Smith   PetscFunctionReturn(0);
510827bd09bSSatish Balay }
511827bd09bSSatish Balay 
5127b1ae94cSBarry Smith /***********************************ivec.c*************************************/
513ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item,  PetscInt *list,  PetscInt n)
514827bd09bSSatish Balay {
51552f87cdaSBarry Smith   PetscInt tmp = n-1;
5165fd66863SKarl Rupp 
5173fdc5746SBarry Smith   PetscFunctionBegin;
518*2fa5cd67SKarl Rupp   while (n--) {
519*2fa5cd67SKarl Rupp     if (*list++ == item) return(tmp-n);
520*2fa5cd67SKarl Rupp   }
521827bd09bSSatish Balay   return(-1);
522827bd09bSSatish Balay }
523827bd09bSSatish Balay 
5247b1ae94cSBarry Smith /***********************************ivec.c*************************************/
525ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search(PetscInt item,  PetscInt *list,  PetscInt rh)
526827bd09bSSatish Balay {
52752f87cdaSBarry Smith   PetscInt mid, lh=0;
528827bd09bSSatish Balay 
529827bd09bSSatish Balay   rh--;
530db4deed7SKarl Rupp   while (lh<=rh) {
531827bd09bSSatish Balay     mid = (lh+rh)>>1;
532*2fa5cd67SKarl Rupp     if (*(list+mid) == item) return(mid);
533*2fa5cd67SKarl Rupp     if (*(list+mid) > item) rh = mid-1;
534*2fa5cd67SKarl Rupp     else lh = mid+1;
535827bd09bSSatish Balay   }
536827bd09bSSatish Balay   return(-1);
537827bd09bSSatish Balay }
538827bd09bSSatish Balay 
5397b1ae94cSBarry Smith /*********************************ivec.c*************************************/
540ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
541827bd09bSSatish Balay {
5423fdc5746SBarry Smith   PetscFunctionBegin;
543*2fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
5443fdc5746SBarry Smith   PetscFunctionReturn(0);
545827bd09bSSatish Balay }
546827bd09bSSatish Balay 
5477b1ae94cSBarry Smith /*********************************ivec.c*************************************/
548ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1,  PetscInt n)
549827bd09bSSatish Balay {
5503fdc5746SBarry Smith   PetscFunctionBegin;
551*2fa5cd67SKarl Rupp   while (n--) *arg1++ = 0.0;
5523fdc5746SBarry Smith   PetscFunctionReturn(0);
553827bd09bSSatish Balay }
554827bd09bSSatish Balay 
5557b1ae94cSBarry Smith /***********************************ivec.c*************************************/
556ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1,  PetscInt n)
557827bd09bSSatish Balay {
5583fdc5746SBarry Smith   PetscFunctionBegin;
559*2fa5cd67SKarl Rupp   while (n--) *arg1++ = 1.0;
5603fdc5746SBarry Smith   PetscFunctionReturn(0);
561827bd09bSSatish Balay }
562827bd09bSSatish Balay 
5637b1ae94cSBarry Smith /***********************************ivec.c*************************************/
564ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
565827bd09bSSatish Balay {
5663fdc5746SBarry Smith   PetscFunctionBegin;
567*2fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
5683fdc5746SBarry Smith   PetscFunctionReturn(0);
569827bd09bSSatish Balay }
570827bd09bSSatish Balay 
5717b1ae94cSBarry Smith /***********************************ivec.c*************************************/
572ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1,  PetscScalar arg2,  PetscInt n)
573827bd09bSSatish Balay {
5743fdc5746SBarry Smith   PetscFunctionBegin;
575*2fa5cd67SKarl Rupp   while (n--) *arg1++ *= arg2;
5763fdc5746SBarry Smith   PetscFunctionReturn(0);
577827bd09bSSatish Balay }
578827bd09bSSatish Balay 
5797b1ae94cSBarry Smith /*********************************ivec.c*************************************/
580ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
581827bd09bSSatish Balay {
5823fdc5746SBarry Smith   PetscFunctionBegin;
583*2fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
5843fdc5746SBarry Smith   PetscFunctionReturn(0);
585827bd09bSSatish Balay }
586827bd09bSSatish Balay 
5877b1ae94cSBarry Smith /*********************************ivec.c*************************************/
588ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
589827bd09bSSatish Balay {
5903fdc5746SBarry Smith   PetscFunctionBegin;
591*2fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
5923fdc5746SBarry Smith   PetscFunctionReturn(0);
593827bd09bSSatish Balay }
594827bd09bSSatish Balay 
5957b1ae94cSBarry Smith /*********************************ivec.c*************************************/
596ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
597827bd09bSSatish Balay {
5983fdc5746SBarry Smith   PetscFunctionBegin;
599*2fa5cd67SKarl Rupp   while (n--) {
600*2fa5cd67SKarl Rupp     *arg1 = PetscMax(*arg1,*arg2);
601*2fa5cd67SKarl Rupp     arg1++;
602*2fa5cd67SKarl Rupp     arg2++;
603*2fa5cd67SKarl Rupp   }
6043fdc5746SBarry Smith   PetscFunctionReturn(0);
605827bd09bSSatish Balay }
606827bd09bSSatish Balay 
6077b1ae94cSBarry Smith /*********************************ivec.c*************************************/
608ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
609827bd09bSSatish Balay {
6103fdc5746SBarry Smith   PetscFunctionBegin;
611*2fa5cd67SKarl Rupp   while (n--) {
612*2fa5cd67SKarl Rupp     *arg1 = MAX_FABS(*arg1,*arg2);
613*2fa5cd67SKarl Rupp     arg1++;
614*2fa5cd67SKarl Rupp     arg2++;
615*2fa5cd67SKarl Rupp   }
6163fdc5746SBarry Smith   PetscFunctionReturn(0);
617827bd09bSSatish Balay }
618827bd09bSSatish Balay 
6197b1ae94cSBarry Smith /*********************************ivec.c*************************************/
620ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
621827bd09bSSatish Balay {
6223fdc5746SBarry Smith   PetscFunctionBegin;
623*2fa5cd67SKarl Rupp   while (n--) {
624*2fa5cd67SKarl Rupp     *arg1 = PetscMin(*arg1,*arg2);
625*2fa5cd67SKarl Rupp     arg1++;
626*2fa5cd67SKarl Rupp     arg2++;
627*2fa5cd67SKarl Rupp   }
6283fdc5746SBarry Smith   PetscFunctionReturn(0);
629827bd09bSSatish Balay }
630827bd09bSSatish Balay 
6317b1ae94cSBarry Smith /*********************************ivec.c*************************************/
632ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
633827bd09bSSatish Balay {
6343fdc5746SBarry Smith   PetscFunctionBegin;
635*2fa5cd67SKarl Rupp   while (n--) {
636*2fa5cd67SKarl Rupp     *arg1 = MIN_FABS(*arg1,*arg2);
637*2fa5cd67SKarl Rupp     arg1++;
638*2fa5cd67SKarl Rupp     arg2++;
639*2fa5cd67SKarl Rupp   }
6403fdc5746SBarry Smith   PetscFunctionReturn(0);
641827bd09bSSatish Balay }
642827bd09bSSatish Balay 
6437b1ae94cSBarry Smith /*********************************ivec.c*************************************/
644ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1,  PetscScalar *arg2,  PetscInt n)
645827bd09bSSatish Balay {
6463fdc5746SBarry Smith   PetscFunctionBegin;
647*2fa5cd67SKarl Rupp   while (n--) {
648*2fa5cd67SKarl Rupp     *arg1 = EXISTS(*arg1,*arg2);
649*2fa5cd67SKarl Rupp     arg1++;
650*2fa5cd67SKarl Rupp     arg2++;
651*2fa5cd67SKarl Rupp   }
6523fdc5746SBarry Smith   PetscFunctionReturn(0);
653827bd09bSSatish Balay }
654827bd09bSSatish Balay 
6557b1ae94cSBarry Smith /***********************************ivec.c*************************************/
656ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2,  PetscInt n,  PetscInt *arg3)
657827bd09bSSatish Balay {
65852f87cdaSBarry Smith   PetscInt i, j, type;
659827bd09bSSatish Balay 
6603fdc5746SBarry Smith   PetscFunctionBegin;
661827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
662db4deed7SKarl Rupp   for (i=0; i<n; ) {
663db4deed7SKarl Rupp 
664827bd09bSSatish Balay     /* clump 'em for now */
665827bd09bSSatish Balay     j    =i+1;
666827bd09bSSatish Balay     type = arg3[i];
667*2fa5cd67SKarl Rupp     while ((j<n)&&(arg3[j]==type)) j++;
668827bd09bSSatish Balay 
669827bd09bSSatish Balay     /* how many together */
670827bd09bSSatish Balay     j -= i;
671827bd09bSSatish Balay 
672827bd09bSSatish Balay     /* call appropriate ivec function */
673*2fa5cd67SKarl Rupp     if (type == GL_MAX)          PCTFS_rvec_max(arg1,arg2,j);
674*2fa5cd67SKarl Rupp     else if (type == GL_MIN)     PCTFS_rvec_min(arg1,arg2,j);
675*2fa5cd67SKarl Rupp     else if (type == GL_MULT)    PCTFS_rvec_mult(arg1,arg2,j);
676*2fa5cd67SKarl Rupp     else if (type == GL_ADD)     PCTFS_rvec_add(arg1,arg2,j);
677*2fa5cd67SKarl Rupp     else if (type == GL_MAX_ABS) PCTFS_rvec_max_abs(arg1,arg2,j);
678*2fa5cd67SKarl Rupp     else if (type == GL_MIN_ABS) PCTFS_rvec_min_abs(arg1,arg2,j);
679*2fa5cd67SKarl Rupp     else if (type == GL_EXISTS)  PCTFS_rvec_exists(arg1,arg2,j);
680ca8e9878SJed Brown     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!");
681827bd09bSSatish Balay 
682827bd09bSSatish Balay     arg1+=j; arg2+=j; i+=j;
683827bd09bSSatish Balay   }
6843fdc5746SBarry Smith   PetscFunctionReturn(0);
685827bd09bSSatish Balay }
686827bd09bSSatish Balay 
6877b1ae94cSBarry Smith /***********************************ivec.c*************************************/
688ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr(PetscInt type)
689827bd09bSSatish Balay {
690*2fa5cd67SKarl Rupp   if (type == NON_UNIFORM)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_non_uniform);
691*2fa5cd67SKarl Rupp   else if (type == GL_MAX)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max);
692*2fa5cd67SKarl Rupp   else if (type == GL_MIN)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min);
693*2fa5cd67SKarl Rupp   else if (type == GL_MULT)    return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_mult);
694*2fa5cd67SKarl Rupp   else if (type == GL_ADD)     return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_add);
695*2fa5cd67SKarl Rupp   else if (type == GL_MAX_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max_abs);
696*2fa5cd67SKarl Rupp   else if (type == GL_MIN_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min_abs);
697*2fa5cd67SKarl Rupp   else if (type == GL_EXISTS)  return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_exists);
698827bd09bSSatish Balay 
699827bd09bSSatish Balay   /* catch all ... not good if we get here */
700827bd09bSSatish Balay   return(NULL);
701827bd09bSSatish Balay }
702827bd09bSSatish Balay 
703827bd09bSSatish Balay 
704827bd09bSSatish Balay 
705827bd09bSSatish Balay 
706827bd09bSSatish Balay 
707827bd09bSSatish Balay 
708