xref: /petsc/src/ksp/pc/impls/tfs/ivec.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
1827bd09bSSatish Balay /**********************************ivec.c**************************************
2827bd09bSSatish Balay 
3827bd09bSSatish Balay Author: Henry M. Tufo III
4827bd09bSSatish Balay 
5827bd09bSSatish Balay e-mail: hmt@cs.brown.edu
6827bd09bSSatish Balay 
7827bd09bSSatish Balay snail-mail:
8827bd09bSSatish Balay Division of Applied Mathematics
9827bd09bSSatish Balay Brown University
10827bd09bSSatish Balay Providence, RI 02912
11827bd09bSSatish Balay 
12827bd09bSSatish Balay Last Modification:
13827bd09bSSatish Balay 6.21.97
14827bd09bSSatish Balay ***********************************ivec.c*************************************/
15827bd09bSSatish Balay 
16c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h>
17827bd09bSSatish Balay 
18827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */
19827bd09bSSatish Balay #define SORT_OPT   6
20827bd09bSSatish Balay #define SORT_STACK 50000
21827bd09bSSatish Balay 
22827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */
23827bd09bSSatish Balay static void    *offset_stack[2 * SORT_STACK];
2452f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK];
25827bd09bSSatish Balay 
267b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_copy(PetscInt * arg1,PetscInt * arg2,PetscInt n)27d71ae5a4SJacob Faibussowitsch PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n)
28d71ae5a4SJacob Faibussowitsch {
292fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
304ad8454bSPierre Jolivet   return arg1;
31827bd09bSSatish Balay }
32827bd09bSSatish Balay 
337b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_zero(PetscInt * arg1,PetscInt n)34d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n)
35d71ae5a4SJacob Faibussowitsch {
363fdc5746SBarry Smith   PetscFunctionBegin;
372fa5cd67SKarl Rupp   while (n--) *arg1++ = 0;
383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
39827bd09bSSatish Balay }
40827bd09bSSatish Balay 
417b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_set(PetscInt * arg1,PetscInt arg2,PetscInt n)42d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n)
43d71ae5a4SJacob Faibussowitsch {
443fdc5746SBarry Smith   PetscFunctionBegin;
452fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
47827bd09bSSatish Balay }
48827bd09bSSatish Balay 
497b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_max(PetscInt * arg1,PetscInt * arg2,PetscInt n)50d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_max(PetscInt *arg1, PetscInt *arg2, PetscInt n)
51d71ae5a4SJacob Faibussowitsch {
523fdc5746SBarry Smith   PetscFunctionBegin;
539371c9d4SSatish Balay   while (n--) {
549371c9d4SSatish Balay     *arg1 = PetscMax(*arg1, *arg2);
559371c9d4SSatish Balay     arg1++;
569371c9d4SSatish Balay     arg2++;
579371c9d4SSatish Balay   }
583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
59827bd09bSSatish Balay }
60827bd09bSSatish Balay 
617b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_min(PetscInt * arg1,PetscInt * arg2,PetscInt n)62d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_min(PetscInt *arg1, PetscInt *arg2, PetscInt n)
63d71ae5a4SJacob Faibussowitsch {
643fdc5746SBarry Smith   PetscFunctionBegin;
652fa5cd67SKarl Rupp   while (n--) {
662fa5cd67SKarl Rupp     *(arg1) = PetscMin(*arg1, *arg2);
672fa5cd67SKarl Rupp     arg1++;
682fa5cd67SKarl Rupp     arg2++;
692fa5cd67SKarl Rupp   }
703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
71827bd09bSSatish Balay }
72827bd09bSSatish Balay 
737b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_mult(PetscInt * arg1,PetscInt * arg2,PetscInt n)74d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1, PetscInt *arg2, PetscInt n)
75d71ae5a4SJacob Faibussowitsch {
763fdc5746SBarry Smith   PetscFunctionBegin;
772fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79827bd09bSSatish Balay }
80827bd09bSSatish Balay 
817b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_add(PetscInt * arg1,PetscInt * arg2,PetscInt n)82d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_add(PetscInt *arg1, PetscInt *arg2, PetscInt n)
83d71ae5a4SJacob Faibussowitsch {
843fdc5746SBarry Smith   PetscFunctionBegin;
852fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
87827bd09bSSatish Balay }
88827bd09bSSatish Balay 
897b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_lxor(PetscInt * arg1,PetscInt * arg2,PetscInt n)90d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1, PetscInt *arg2, PetscInt n)
91d71ae5a4SJacob Faibussowitsch {
923fdc5746SBarry Smith   PetscFunctionBegin;
932fa5cd67SKarl Rupp   while (n--) {
9457508eceSPierre Jolivet     *arg1 = (*arg1 || *arg2) && !(*arg1 && *arg2);
952fa5cd67SKarl Rupp     arg1++;
962fa5cd67SKarl Rupp     arg2++;
972fa5cd67SKarl Rupp   }
983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
99827bd09bSSatish Balay }
100827bd09bSSatish Balay 
1017b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_xor(PetscInt * arg1,PetscInt * arg2,PetscInt n)102d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1, PetscInt *arg2, PetscInt n)
103d71ae5a4SJacob Faibussowitsch {
1043fdc5746SBarry Smith   PetscFunctionBegin;
1052fa5cd67SKarl Rupp   while (n--) *arg1++ ^= *arg2++;
1063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
107827bd09bSSatish Balay }
108827bd09bSSatish Balay 
1097b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_or(PetscInt * arg1,PetscInt * arg2,PetscInt n)110d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_or(PetscInt *arg1, PetscInt *arg2, PetscInt n)
111d71ae5a4SJacob Faibussowitsch {
1123fdc5746SBarry Smith   PetscFunctionBegin;
1132fa5cd67SKarl Rupp   while (n--) *arg1++ |= *arg2++;
1143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
115827bd09bSSatish Balay }
116827bd09bSSatish Balay 
1177b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_lor(PetscInt * arg1,PetscInt * arg2,PetscInt n)118d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1, PetscInt *arg2, PetscInt n)
119d71ae5a4SJacob Faibussowitsch {
1203fdc5746SBarry Smith   PetscFunctionBegin;
1212fa5cd67SKarl Rupp   while (n--) {
1222fa5cd67SKarl Rupp     *arg1 = (*arg1 || *arg2);
1232fa5cd67SKarl Rupp     arg1++;
1242fa5cd67SKarl Rupp     arg2++;
1252fa5cd67SKarl Rupp   }
1263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
127827bd09bSSatish Balay }
128827bd09bSSatish Balay 
1297b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_and(PetscInt * arg1,PetscInt * arg2,PetscInt n)130d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_and(PetscInt *arg1, PetscInt *arg2, PetscInt n)
131d71ae5a4SJacob Faibussowitsch {
1323fdc5746SBarry Smith   PetscFunctionBegin;
1332fa5cd67SKarl Rupp   while (n--) *arg1++ &= *arg2++;
1343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
135827bd09bSSatish Balay }
136827bd09bSSatish Balay 
1377b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_land(PetscInt * arg1,PetscInt * arg2,PetscInt n)138d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_land(PetscInt *arg1, PetscInt *arg2, PetscInt n)
139d71ae5a4SJacob Faibussowitsch {
1403fdc5746SBarry Smith   PetscFunctionBegin;
1412fa5cd67SKarl Rupp   while (n--) {
1422fa5cd67SKarl Rupp     *arg1 = (*arg1 && *arg2);
1432fa5cd67SKarl Rupp     arg1++;
1442fa5cd67SKarl Rupp     arg2++;
1452fa5cd67SKarl Rupp   }
1463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
147827bd09bSSatish Balay }
148827bd09bSSatish Balay 
1497b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_and3(PetscInt * arg1,PetscInt * arg2,PetscInt * arg3,PetscInt n)150d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n)
151d71ae5a4SJacob Faibussowitsch {
1523fdc5746SBarry Smith   PetscFunctionBegin;
1532fa5cd67SKarl Rupp   while (n--) *arg1++ = (*arg2++ & *arg3++);
1543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
155827bd09bSSatish Balay }
156827bd09bSSatish Balay 
1577b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_sum(PetscInt * arg1,PetscInt n)158d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_sum(PetscInt *arg1, PetscInt n)
159d71ae5a4SJacob Faibussowitsch {
16052f87cdaSBarry Smith   PetscInt tmp = 0;
1612fa5cd67SKarl Rupp   while (n--) tmp += *arg1++;
1624ad8454bSPierre Jolivet   return tmp;
163827bd09bSSatish Balay }
164827bd09bSSatish Balay 
1657b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_non_uniform(PetscInt * arg1,PetscInt * arg2,PetscInt n,...)166d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, ...)
167d71ae5a4SJacob Faibussowitsch {
16852f87cdaSBarry Smith   PetscInt  i, j, type;
1696ae68b59SBarry Smith   PetscInt *arg3;
1706ae68b59SBarry Smith   va_list   ap;
171827bd09bSSatish Balay 
1723fdc5746SBarry Smith   PetscFunctionBegin;
1736ae68b59SBarry Smith   va_start(ap, n);
1746ae68b59SBarry Smith   arg3 = va_arg(ap, PetscInt *);
1756ae68b59SBarry Smith   va_end(ap);
1766ae68b59SBarry Smith 
177827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
178db4deed7SKarl Rupp   for (i = 0; i < n;) {
179827bd09bSSatish Balay     /* clump 'em for now */
180827bd09bSSatish Balay     j    = i + 1;
181827bd09bSSatish Balay     type = arg3[i];
1822fa5cd67SKarl Rupp     while ((j < n) && (arg3[j] == type)) j++;
183827bd09bSSatish Balay 
184827bd09bSSatish Balay     /* how many together */
185827bd09bSSatish Balay     j -= i;
186827bd09bSSatish Balay 
187827bd09bSSatish Balay     /* call appropriate ivec function */
1883ba16761SJacob Faibussowitsch     if (type == GL_MAX) PetscCall(PCTFS_ivec_max(arg1, arg2, j));
1893ba16761SJacob Faibussowitsch     else if (type == GL_MIN) PetscCall(PCTFS_ivec_min(arg1, arg2, j));
1903ba16761SJacob Faibussowitsch     else if (type == GL_MULT) PetscCall(PCTFS_ivec_mult(arg1, arg2, j));
1913ba16761SJacob Faibussowitsch     else if (type == GL_ADD) PetscCall(PCTFS_ivec_add(arg1, arg2, j));
1923ba16761SJacob Faibussowitsch     else if (type == GL_B_XOR) PetscCall(PCTFS_ivec_xor(arg1, arg2, j));
1933ba16761SJacob Faibussowitsch     else if (type == GL_B_OR) PetscCall(PCTFS_ivec_or(arg1, arg2, j));
1943ba16761SJacob Faibussowitsch     else if (type == GL_B_AND) PetscCall(PCTFS_ivec_and(arg1, arg2, j));
1953ba16761SJacob Faibussowitsch     else if (type == GL_L_XOR) PetscCall(PCTFS_ivec_lxor(arg1, arg2, j));
1963ba16761SJacob Faibussowitsch     else if (type == GL_L_OR) PetscCall(PCTFS_ivec_lor(arg1, arg2, j));
1973ba16761SJacob Faibussowitsch     else if (type == GL_L_AND) PetscCall(PCTFS_ivec_land(arg1, arg2, j));
198db4deed7SKarl Rupp     else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "unrecognized type passed to PCTFS_ivec_non_uniform()!");
199827bd09bSSatish Balay 
2009371c9d4SSatish Balay     arg1 += j;
2019371c9d4SSatish Balay     arg2 += j;
2029371c9d4SSatish Balay     i += j;
203827bd09bSSatish Balay   }
2043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
205827bd09bSSatish Balay }
206827bd09bSSatish Balay 
2077b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_fct_addr(PetscInt type)208d71ae5a4SJacob Faibussowitsch vfp PCTFS_ivec_fct_addr(PetscInt type)
209d71ae5a4SJacob Faibussowitsch {
2104ad8454bSPierre Jolivet   if (type == NON_UNIFORM) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_non_uniform;
2114ad8454bSPierre Jolivet   else if (type == GL_MAX) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_max;
2124ad8454bSPierre Jolivet   else if (type == GL_MIN) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_min;
2134ad8454bSPierre Jolivet   else if (type == GL_MULT) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_mult;
2144ad8454bSPierre Jolivet   else if (type == GL_ADD) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_add;
2154ad8454bSPierre Jolivet   else if (type == GL_B_XOR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_xor;
2164ad8454bSPierre Jolivet   else if (type == GL_B_OR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_or;
2174ad8454bSPierre Jolivet   else if (type == GL_B_AND) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_and;
2184ad8454bSPierre Jolivet   else if (type == GL_L_XOR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_lxor;
2194ad8454bSPierre Jolivet   else if (type == GL_L_OR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_lor;
2204ad8454bSPierre Jolivet   else if (type == GL_L_AND) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_land;
221827bd09bSSatish Balay 
222827bd09bSSatish Balay   /* catch all ... not good if we get here */
2234ad8454bSPierre Jolivet   return NULL;
224827bd09bSSatish Balay }
225827bd09bSSatish Balay 
2267b1ae94cSBarry Smith /******************************************************************************/
PCTFS_ivec_sort(PetscInt * ar,PetscInt size)227d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort(PetscInt *ar, PetscInt size)
228d71ae5a4SJacob Faibussowitsch {
22952f87cdaSBarry Smith   PetscInt  *pi, *pj, temp;
23052f87cdaSBarry Smith   PetscInt **top_a = (PetscInt **)offset_stack;
23152f87cdaSBarry Smith   PetscInt  *top_s = size_stack, *bottom_s = size_stack;
232827bd09bSSatish Balay 
233b458e8f1SJose E. Roman   PetscFunctionBegin;
234827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
235827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
236827bd09bSSatish Balay   size--;
237827bd09bSSatish Balay 
238827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
239db4deed7SKarl Rupp   for (;;) {
240827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
241db4deed7SKarl Rupp     if (size > SORT_OPT) {
242827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
243827bd09bSSatish Balay       pi = ar + 1;
244827bd09bSSatish Balay       pj = ar + size;
245827bd09bSSatish Balay 
246827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
247*b6555650SPierre Jolivet       SWAP(*(ar + (size >> 1)), *pi);
248827bd09bSSatish Balay 
249827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
250827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
251*b6555650SPierre Jolivet       if (*pi > *pj) SWAP(*pi, *pj);
252*b6555650SPierre Jolivet       if (*ar > *pj) SWAP(*ar, *pj);
253*b6555650SPierre Jolivet       else if (*pi > *ar) SWAP(*(ar), *(ar + 1));
254827bd09bSSatish Balay 
255827bd09bSSatish Balay       /* partition about pivot_value ...                              */
256827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
257db4deed7SKarl Rupp       for (;;) {
258827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
2599371c9d4SSatish Balay         do pi++;
2609371c9d4SSatish Balay         while (*pi < *ar);
2619371c9d4SSatish Balay         do pj--;
2629371c9d4SSatish Balay         while (*pj > *ar);
263827bd09bSSatish Balay 
264827bd09bSSatish Balay         /* if we've crossed we're done */
265827bd09bSSatish Balay         if (pj < pi) break;
266827bd09bSSatish Balay 
267827bd09bSSatish Balay         /* else swap */
268*b6555650SPierre Jolivet         SWAP(*pi, *pj);
269827bd09bSSatish Balay       }
270827bd09bSSatish Balay 
271827bd09bSSatish Balay       /* place pivot_value in it's correct location */
272*b6555650SPierre Jolivet       SWAP(*ar, *pj);
273827bd09bSSatish Balay 
274827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
27508401ef6SPierre Jolivet       PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort() :: STACK EXHAUSTED!!!");
276827bd09bSSatish Balay 
277827bd09bSSatish Balay       /* push right hand child iff length > 1 */
278db4deed7SKarl Rupp       if ((*top_s = size - ((PetscInt)(pi - ar)))) {
279827bd09bSSatish Balay         *(top_a++) = pi;
280827bd09bSSatish Balay         size -= *top_s + 2;
281827bd09bSSatish Balay         top_s++;
2829371c9d4SSatish Balay       } else if (size -= *top_s + 2)
2839371c9d4SSatish Balay         ; /* set up for next loop iff there is something to do */
2849371c9d4SSatish Balay       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar = *(--top_a);
285827bd09bSSatish Balay         size                                                            = *(--top_s);
286827bd09bSSatish Balay       }
287db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
288827bd09bSSatish Balay 
289827bd09bSSatish Balay       /* insertion sort for bottom */
290db4deed7SKarl Rupp       for (pj = ar + 1; pj <= ar + size; pj++) {
291827bd09bSSatish Balay         temp = *pj;
292db4deed7SKarl Rupp         for (pi = pj - 1; pi >= ar; pi--) {
293827bd09bSSatish Balay           if (*pi <= temp) break;
294827bd09bSSatish Balay           *(pi + 1) = *pi;
295827bd09bSSatish Balay         }
296827bd09bSSatish Balay         *(pi + 1) = temp;
297827bd09bSSatish Balay       }
298827bd09bSSatish Balay 
299827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
3003ba16761SJacob Faibussowitsch       if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS);
301827bd09bSSatish Balay 
302827bd09bSSatish Balay       /* else pop another list from the stack */
303827bd09bSSatish Balay       ar   = *(--top_a);
304827bd09bSSatish Balay       size = *(--top_s);
305827bd09bSSatish Balay     }
306827bd09bSSatish Balay   }
307827bd09bSSatish Balay }
308827bd09bSSatish Balay 
3097b1ae94cSBarry Smith /******************************************************************************/
PCTFS_ivec_sort_companion(PetscInt * ar,PetscInt * ar2,PetscInt size)310d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar, PetscInt *ar2, PetscInt size)
311d71ae5a4SJacob Faibussowitsch {
31252f87cdaSBarry Smith   PetscInt  *pi, *pj, temp, temp2;
31352f87cdaSBarry Smith   PetscInt **top_a = (PetscInt **)offset_stack;
31452f87cdaSBarry Smith   PetscInt  *top_s = size_stack, *bottom_s = size_stack;
31552f87cdaSBarry Smith   PetscInt  *pi2, *pj2;
31652f87cdaSBarry Smith   PetscInt   mid;
317827bd09bSSatish Balay 
3183fdc5746SBarry Smith   PetscFunctionBegin;
319827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
320827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
321827bd09bSSatish Balay   size--;
322827bd09bSSatish Balay 
323827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
324db4deed7SKarl Rupp   for (;;) {
325827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
326db4deed7SKarl Rupp     if (size > SORT_OPT) {
327827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
328827bd09bSSatish Balay       mid = size >> 1;
329827bd09bSSatish Balay       pi  = ar + 1;
330827bd09bSSatish Balay       pj  = ar + mid;
331827bd09bSSatish Balay       pi2 = ar2 + 1;
332827bd09bSSatish Balay       pj2 = ar2 + mid;
333827bd09bSSatish Balay 
334827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
335*b6555650SPierre Jolivet       SWAP(*pi, *pj);
336*b6555650SPierre Jolivet       SWAP(*pi2, *pj2);
337827bd09bSSatish Balay 
338827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
339827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
340827bd09bSSatish Balay       pj  = ar + size;
341827bd09bSSatish Balay       pj2 = ar2 + size;
342*b6555650SPierre Jolivet       if (*pi > *pj) {
343*b6555650SPierre Jolivet         SWAP(*pi, *pj);
344*b6555650SPierre Jolivet         SWAP(*pi2, *pj2);
345*b6555650SPierre Jolivet       }
3469371c9d4SSatish Balay       if (*ar > *pj) {
347*b6555650SPierre Jolivet         SWAP(*ar, *pj);
348*b6555650SPierre Jolivet         SWAP(*ar2, *pj2);
3499371c9d4SSatish Balay       } else if (*pi > *ar) {
350*b6555650SPierre Jolivet         SWAP(*(ar), *(ar + 1));
351*b6555650SPierre Jolivet         SWAP(*(ar2), *(ar2 + 1));
3529371c9d4SSatish Balay       }
353827bd09bSSatish Balay 
354827bd09bSSatish Balay       /* partition about pivot_value ...                              */
355827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
356db4deed7SKarl Rupp       for (;;) {
357827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
3589371c9d4SSatish Balay         do {
3599371c9d4SSatish Balay           pi++;
3609371c9d4SSatish Balay           pi2++;
3619371c9d4SSatish Balay         } while (*pi < *ar);
3629371c9d4SSatish Balay         do {
3639371c9d4SSatish Balay           pj--;
3649371c9d4SSatish Balay           pj2--;
3659371c9d4SSatish Balay         } while (*pj > *ar);
366827bd09bSSatish Balay 
367827bd09bSSatish Balay         /* if we've crossed we're done */
368827bd09bSSatish Balay         if (pj < pi) break;
369827bd09bSSatish Balay 
370827bd09bSSatish Balay         /* else swap */
371*b6555650SPierre Jolivet         SWAP(*pi, *pj);
372*b6555650SPierre Jolivet         SWAP(*pi2, *pj2);
373827bd09bSSatish Balay       }
374827bd09bSSatish Balay 
375827bd09bSSatish Balay       /* place pivot_value in it's correct location */
376*b6555650SPierre Jolivet       SWAP(*ar, *pj);
377*b6555650SPierre Jolivet       SWAP(*ar2, *pj2);
378827bd09bSSatish Balay 
379827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
38008401ef6SPierre Jolivet       PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!");
381827bd09bSSatish Balay 
382827bd09bSSatish Balay       /* push right hand child iff length > 1 */
383db4deed7SKarl Rupp       if ((*top_s = size - ((PetscInt)(pi - ar)))) {
384827bd09bSSatish Balay         *(top_a++) = pi;
385827bd09bSSatish Balay         *(top_a++) = pi2;
386827bd09bSSatish Balay         size -= *top_s + 2;
387827bd09bSSatish Balay         top_s++;
3889371c9d4SSatish Balay       } else if (size -= *top_s + 2)
3899371c9d4SSatish Balay         ; /* set up for next loop iff there is something to do */
3909371c9d4SSatish Balay       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar2 = *(--top_a);
391827bd09bSSatish Balay         ar                                                               = *(--top_a);
392827bd09bSSatish Balay         size                                                             = *(--top_s);
393827bd09bSSatish Balay       }
394db4deed7SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
395827bd09bSSatish Balay 
396827bd09bSSatish Balay       /* insertion sort for bottom */
397db4deed7SKarl Rupp       for (pj = ar + 1, pj2 = ar2 + 1; pj <= ar + size; pj++, pj2++) {
398827bd09bSSatish Balay         temp  = *pj;
399827bd09bSSatish Balay         temp2 = *pj2;
400db4deed7SKarl Rupp         for (pi = pj - 1, pi2 = pj2 - 1; pi >= ar; pi--, pi2--) {
401827bd09bSSatish Balay           if (*pi <= temp) break;
402827bd09bSSatish Balay           *(pi + 1)  = *pi;
403827bd09bSSatish Balay           *(pi2 + 1) = *pi2;
404827bd09bSSatish Balay         }
405827bd09bSSatish Balay         *(pi + 1)  = temp;
406827bd09bSSatish Balay         *(pi2 + 1) = temp2;
407827bd09bSSatish Balay       }
408827bd09bSSatish Balay 
409827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
4103ba16761SJacob Faibussowitsch       if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS);
411827bd09bSSatish Balay 
412827bd09bSSatish Balay       /* else pop another list from the stack */
413827bd09bSSatish Balay       ar2  = *(--top_a);
414827bd09bSSatish Balay       ar   = *(--top_a);
415827bd09bSSatish Balay       size = *(--top_s);
416827bd09bSSatish Balay     }
417827bd09bSSatish Balay   }
418827bd09bSSatish Balay }
419827bd09bSSatish Balay 
4207b1ae94cSBarry Smith /******************************************************************************/
PCTFS_ivec_sort_companion_hack(PetscInt * ar,PetscInt ** ar2,PetscInt size)421d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar, PetscInt **ar2, PetscInt size)
422d71ae5a4SJacob Faibussowitsch {
42352f87cdaSBarry Smith   PetscInt  *pi, *pj, temp, *ptr;
42452f87cdaSBarry Smith   PetscInt **top_a = (PetscInt **)offset_stack;
42552f87cdaSBarry Smith   PetscInt  *top_s = size_stack, *bottom_s = size_stack;
42652f87cdaSBarry Smith   PetscInt **pi2, **pj2;
42752f87cdaSBarry Smith   PetscInt   mid;
428827bd09bSSatish Balay 
4293fdc5746SBarry Smith   PetscFunctionBegin;
430827bd09bSSatish Balay   /* we're really interested in the offset of the last element */
431827bd09bSSatish Balay   /* ==> length of the list is now size + 1                    */
432827bd09bSSatish Balay   size--;
433827bd09bSSatish Balay 
434827bd09bSSatish Balay   /* do until we're done ... return when stack is exhausted */
435db4deed7SKarl Rupp   for (;;) {
436827bd09bSSatish Balay     /* if list is large enough use quicksort partition exchange code */
437db4deed7SKarl Rupp     if (size > SORT_OPT) {
438827bd09bSSatish Balay       /* start up pointer at element 1 and down at size     */
439827bd09bSSatish Balay       mid = size >> 1;
440827bd09bSSatish Balay       pi  = ar + 1;
441827bd09bSSatish Balay       pj  = ar + mid;
442827bd09bSSatish Balay       pi2 = ar2 + 1;
443827bd09bSSatish Balay       pj2 = ar2 + mid;
444827bd09bSSatish Balay 
445827bd09bSSatish Balay       /* find middle element in list and swap w/ element 1 */
446*b6555650SPierre Jolivet       SWAP(*pi, *pj);
447*b6555650SPierre Jolivet       P_SWAP(*pi2, *pj2);
448827bd09bSSatish Balay 
449827bd09bSSatish Balay       /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */
450827bd09bSSatish Balay       /* note ==> pivot_value in index 0                   */
451827bd09bSSatish Balay       pj  = ar + size;
452827bd09bSSatish Balay       pj2 = ar2 + size;
453*b6555650SPierre Jolivet       if (*pi > *pj) {
454*b6555650SPierre Jolivet         SWAP(*pi, *pj);
455*b6555650SPierre Jolivet         P_SWAP(*pi2, *pj2);
456*b6555650SPierre Jolivet       }
4579371c9d4SSatish Balay       if (*ar > *pj) {
458*b6555650SPierre Jolivet         SWAP(*ar, *pj);
459*b6555650SPierre Jolivet         P_SWAP(*ar2, *pj2);
4609371c9d4SSatish Balay       } else if (*pi > *ar) {
461*b6555650SPierre Jolivet         SWAP(*(ar), *(ar + 1));
462*b6555650SPierre Jolivet         P_SWAP(*(ar2), *(ar2 + 1));
4639371c9d4SSatish Balay       }
464827bd09bSSatish Balay 
465827bd09bSSatish Balay       /* partition about pivot_value ...                              */
466827bd09bSSatish Balay       /* note lists of length 2 are not guaranteed to be sorted */
467db4deed7SKarl Rupp       for (;;) {
468827bd09bSSatish Balay         /* walk up ... and down ... swap if equal to pivot! */
4699371c9d4SSatish Balay         do {
4709371c9d4SSatish Balay           pi++;
4719371c9d4SSatish Balay           pi2++;
4729371c9d4SSatish Balay         } while (*pi < *ar);
4739371c9d4SSatish Balay         do {
4749371c9d4SSatish Balay           pj--;
4759371c9d4SSatish Balay           pj2--;
4769371c9d4SSatish Balay         } while (*pj > *ar);
477827bd09bSSatish Balay 
478827bd09bSSatish Balay         /* if we've crossed we're done */
479827bd09bSSatish Balay         if (pj < pi) break;
480827bd09bSSatish Balay 
481827bd09bSSatish Balay         /* else swap */
482*b6555650SPierre Jolivet         SWAP(*pi, *pj);
483*b6555650SPierre Jolivet         P_SWAP(*pi2, *pj2);
484827bd09bSSatish Balay       }
485827bd09bSSatish Balay 
486827bd09bSSatish Balay       /* place pivot_value in it's correct location */
487*b6555650SPierre Jolivet       SWAP(*ar, *pj);
488*b6555650SPierre Jolivet       P_SWAP(*ar2, *pj2);
489827bd09bSSatish Balay 
490827bd09bSSatish Balay       /* test stack_size to see if we've exhausted our stack */
49108401ef6SPierre Jolivet       PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!");
492827bd09bSSatish Balay 
493827bd09bSSatish Balay       /* push right hand child iff length > 1 */
494db4deed7SKarl Rupp       if ((*top_s = size - ((PetscInt)(pi - ar)))) {
495827bd09bSSatish Balay         *(top_a++) = pi;
49652f87cdaSBarry Smith         *(top_a++) = (PetscInt *)pi2;
497827bd09bSSatish Balay         size -= *top_s + 2;
498827bd09bSSatish Balay         top_s++;
4999371c9d4SSatish Balay       } else if (size -= *top_s + 2)
5009371c9d4SSatish Balay         ; /* set up for next loop iff there is something to do */
5019371c9d4SSatish Balay       else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar2 = (PetscInt **)*(--top_a);
502827bd09bSSatish Balay         ar                                                               = *(--top_a);
503827bd09bSSatish Balay         size                                                             = *(--top_s);
504827bd09bSSatish Balay       }
5052fa5cd67SKarl Rupp     } else { /* else sort small list directly then pop another off stack */
506827bd09bSSatish Balay       /* insertion sort for bottom */
507db4deed7SKarl Rupp       for (pj = ar + 1, pj2 = ar2 + 1; pj <= ar + size; pj++, pj2++) {
508827bd09bSSatish Balay         temp = *pj;
509827bd09bSSatish Balay         ptr  = *pj2;
510db4deed7SKarl Rupp         for (pi = pj - 1, pi2 = pj2 - 1; pi >= ar; pi--, pi2--) {
511827bd09bSSatish Balay           if (*pi <= temp) break;
512827bd09bSSatish Balay           *(pi + 1)  = *pi;
513827bd09bSSatish Balay           *(pi2 + 1) = *pi2;
514827bd09bSSatish Balay         }
515827bd09bSSatish Balay         *(pi + 1)  = temp;
516827bd09bSSatish Balay         *(pi2 + 1) = ptr;
517827bd09bSSatish Balay       }
518827bd09bSSatish Balay 
519827bd09bSSatish Balay       /* check to see if stack is exhausted ==> DONE */
5203ba16761SJacob Faibussowitsch       if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS);
521827bd09bSSatish Balay 
522827bd09bSSatish Balay       /* else pop another list from the stack */
52352f87cdaSBarry Smith       ar2  = (PetscInt **)*(--top_a);
524827bd09bSSatish Balay       ar   = *(--top_a);
525827bd09bSSatish Balay       size = *(--top_s);
526827bd09bSSatish Balay     }
527827bd09bSSatish Balay   }
528827bd09bSSatish Balay }
529827bd09bSSatish Balay 
5307b1ae94cSBarry Smith /******************************************************************************/
PCTFS_SMI_sort(void * ar1,void * ar2,PetscInt size,PetscInt type)531d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type)
532d71ae5a4SJacob Faibussowitsch {
5333fdc5746SBarry Smith   PetscFunctionBegin;
534e7e72b3dSBarry Smith   if (type == SORT_INTEGER) {
5353ba16761SJacob Faibussowitsch     if (ar2) PetscCall(PCTFS_ivec_sort_companion((PetscInt *)ar1, (PetscInt *)ar2, size));
5363ba16761SJacob Faibussowitsch     else PetscCall(PCTFS_ivec_sort((PetscInt *)ar1, size));
537e7e72b3dSBarry Smith   } else if (type == SORT_INT_PTR) {
5383ba16761SJacob Faibussowitsch     if (ar2) PetscCall(PCTFS_ivec_sort_companion_hack((PetscInt *)ar1, (PetscInt **)ar2, size));
5393ba16761SJacob Faibussowitsch     else PetscCall(PCTFS_ivec_sort((PetscInt *)ar1, size));
540ca8e9878SJed Brown   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_SMI_sort only does SORT_INTEGER!");
5413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
542827bd09bSSatish Balay }
543827bd09bSSatish Balay 
5447b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_linear_search(PetscInt item,PetscInt * list,PetscInt n)545d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_linear_search(PetscInt item, PetscInt *list, PetscInt n)
546d71ae5a4SJacob Faibussowitsch {
54752f87cdaSBarry Smith   PetscInt tmp = n - 1;
5485fd66863SKarl Rupp 
5492fa5cd67SKarl Rupp   while (n--) {
5504ad8454bSPierre Jolivet     if (*list++ == item) return tmp - n;
5512fa5cd67SKarl Rupp   }
5524ad8454bSPierre Jolivet   return -1;
553827bd09bSSatish Balay }
554827bd09bSSatish Balay 
5557b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_ivec_binary_search(PetscInt item,PetscInt * list,PetscInt rh)556d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_binary_search(PetscInt item, PetscInt *list, PetscInt rh)
557d71ae5a4SJacob Faibussowitsch {
55852f87cdaSBarry Smith   PetscInt mid, lh = 0;
559827bd09bSSatish Balay 
560827bd09bSSatish Balay   rh--;
561db4deed7SKarl Rupp   while (lh <= rh) {
562827bd09bSSatish Balay     mid = (lh + rh) >> 1;
5634ad8454bSPierre Jolivet     if (*(list + mid) == item) return mid;
5642fa5cd67SKarl Rupp     if (*(list + mid) > item) rh = mid - 1;
5652fa5cd67SKarl Rupp     else lh = mid + 1;
566827bd09bSSatish Balay   }
5674ad8454bSPierre Jolivet   return -1;
568827bd09bSSatish Balay }
569827bd09bSSatish Balay 
5707b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_copy(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)571d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
572d71ae5a4SJacob Faibussowitsch {
5733fdc5746SBarry Smith   PetscFunctionBegin;
5742fa5cd67SKarl Rupp   while (n--) *arg1++ = *arg2++;
5753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
576827bd09bSSatish Balay }
577827bd09bSSatish Balay 
5787b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_zero(PetscScalar * arg1,PetscInt n)579d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1, PetscInt n)
580d71ae5a4SJacob Faibussowitsch {
5813fdc5746SBarry Smith   PetscFunctionBegin;
5822fa5cd67SKarl Rupp   while (n--) *arg1++ = 0.0;
5833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
584827bd09bSSatish Balay }
585827bd09bSSatish Balay 
5867b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_rvec_one(PetscScalar * arg1,PetscInt n)587d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1, PetscInt n)
588d71ae5a4SJacob Faibussowitsch {
5893fdc5746SBarry Smith   PetscFunctionBegin;
5902fa5cd67SKarl Rupp   while (n--) *arg1++ = 1.0;
5913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
592827bd09bSSatish Balay }
593827bd09bSSatish Balay 
5947b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_rvec_set(PetscScalar * arg1,PetscScalar arg2,PetscInt n)595d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1, PetscScalar arg2, PetscInt n)
596d71ae5a4SJacob Faibussowitsch {
5973fdc5746SBarry Smith   PetscFunctionBegin;
5982fa5cd67SKarl Rupp   while (n--) *arg1++ = arg2;
5993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
600827bd09bSSatish Balay }
601827bd09bSSatish Balay 
6027b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_rvec_scale(PetscScalar * arg1,PetscScalar arg2,PetscInt n)603d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1, PetscScalar arg2, PetscInt n)
604d71ae5a4SJacob Faibussowitsch {
6053fdc5746SBarry Smith   PetscFunctionBegin;
6062fa5cd67SKarl Rupp   while (n--) *arg1++ *= arg2;
6073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
608827bd09bSSatish Balay }
609827bd09bSSatish Balay 
6107b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_add(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)611d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
612d71ae5a4SJacob Faibussowitsch {
6133fdc5746SBarry Smith   PetscFunctionBegin;
6142fa5cd67SKarl Rupp   while (n--) *arg1++ += *arg2++;
6153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
616827bd09bSSatish Balay }
617827bd09bSSatish Balay 
6187b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_mult(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)619d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
620d71ae5a4SJacob Faibussowitsch {
6213fdc5746SBarry Smith   PetscFunctionBegin;
6222fa5cd67SKarl Rupp   while (n--) *arg1++ *= *arg2++;
6233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
624827bd09bSSatish Balay }
625827bd09bSSatish Balay 
6267b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_max(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)627d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
628d71ae5a4SJacob Faibussowitsch {
6293fdc5746SBarry Smith   PetscFunctionBegin;
6302fa5cd67SKarl Rupp   while (n--) {
6312fa5cd67SKarl Rupp     *arg1 = PetscMax(*arg1, *arg2);
6322fa5cd67SKarl Rupp     arg1++;
6332fa5cd67SKarl Rupp     arg2++;
6342fa5cd67SKarl Rupp   }
6353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
636827bd09bSSatish Balay }
637827bd09bSSatish Balay 
6387b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_max_abs(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)639d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
640d71ae5a4SJacob Faibussowitsch {
6413fdc5746SBarry Smith   PetscFunctionBegin;
6422fa5cd67SKarl Rupp   while (n--) {
6432fa5cd67SKarl Rupp     *arg1 = MAX_FABS(*arg1, *arg2);
6442fa5cd67SKarl Rupp     arg1++;
6452fa5cd67SKarl Rupp     arg2++;
6462fa5cd67SKarl Rupp   }
6473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
648827bd09bSSatish Balay }
649827bd09bSSatish Balay 
6507b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_min(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)651d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
652d71ae5a4SJacob Faibussowitsch {
6533fdc5746SBarry Smith   PetscFunctionBegin;
6542fa5cd67SKarl Rupp   while (n--) {
6552fa5cd67SKarl Rupp     *arg1 = PetscMin(*arg1, *arg2);
6562fa5cd67SKarl Rupp     arg1++;
6572fa5cd67SKarl Rupp     arg2++;
6582fa5cd67SKarl Rupp   }
6593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
660827bd09bSSatish Balay }
661827bd09bSSatish Balay 
6627b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_min_abs(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)663d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
664d71ae5a4SJacob Faibussowitsch {
6653fdc5746SBarry Smith   PetscFunctionBegin;
6662fa5cd67SKarl Rupp   while (n--) {
6672fa5cd67SKarl Rupp     *arg1 = MIN_FABS(*arg1, *arg2);
6682fa5cd67SKarl Rupp     arg1++;
6692fa5cd67SKarl Rupp     arg2++;
6702fa5cd67SKarl Rupp   }
6713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
672827bd09bSSatish Balay }
673827bd09bSSatish Balay 
6747b1ae94cSBarry Smith /*********************************ivec.c*************************************/
PCTFS_rvec_exists(PetscScalar * arg1,PetscScalar * arg2,PetscInt n)67566976f2fSJacob Faibussowitsch static PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1, PetscScalar *arg2, PetscInt n)
676d71ae5a4SJacob Faibussowitsch {
6773fdc5746SBarry Smith   PetscFunctionBegin;
6782fa5cd67SKarl Rupp   while (n--) {
6792fa5cd67SKarl Rupp     *arg1 = EXISTS(*arg1, *arg2);
6802fa5cd67SKarl Rupp     arg1++;
6812fa5cd67SKarl Rupp     arg2++;
6822fa5cd67SKarl Rupp   }
6833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
684827bd09bSSatish Balay }
685827bd09bSSatish Balay 
6867b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_rvec_non_uniform(PetscScalar * arg1,PetscScalar * arg2,PetscInt n,PetscInt * arg3)68766976f2fSJacob Faibussowitsch static PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3)
688d71ae5a4SJacob Faibussowitsch {
68952f87cdaSBarry Smith   PetscInt i, j, type;
690827bd09bSSatish Balay 
6913fdc5746SBarry Smith   PetscFunctionBegin;
692827bd09bSSatish Balay   /* LATER: if we're really motivated we can sort and then unsort */
693db4deed7SKarl Rupp   for (i = 0; i < n;) {
694827bd09bSSatish Balay     /* clump 'em for now */
695827bd09bSSatish Balay     j    = i + 1;
696827bd09bSSatish Balay     type = arg3[i];
6972fa5cd67SKarl Rupp     while ((j < n) && (arg3[j] == type)) j++;
698827bd09bSSatish Balay 
699827bd09bSSatish Balay     /* how many together */
700827bd09bSSatish Balay     j -= i;
701827bd09bSSatish Balay 
702827bd09bSSatish Balay     /* call appropriate ivec function */
7033ba16761SJacob Faibussowitsch     if (type == GL_MAX) PetscCall(PCTFS_rvec_max(arg1, arg2, j));
7043ba16761SJacob Faibussowitsch     else if (type == GL_MIN) PetscCall(PCTFS_rvec_min(arg1, arg2, j));
7053ba16761SJacob Faibussowitsch     else if (type == GL_MULT) PetscCall(PCTFS_rvec_mult(arg1, arg2, j));
7063ba16761SJacob Faibussowitsch     else if (type == GL_ADD) PetscCall(PCTFS_rvec_add(arg1, arg2, j));
7073ba16761SJacob Faibussowitsch     else if (type == GL_MAX_ABS) PetscCall(PCTFS_rvec_max_abs(arg1, arg2, j));
7083ba16761SJacob Faibussowitsch     else if (type == GL_MIN_ABS) PetscCall(PCTFS_rvec_min_abs(arg1, arg2, j));
7093ba16761SJacob Faibussowitsch     else if (type == GL_EXISTS) PetscCall(PCTFS_rvec_exists(arg1, arg2, j));
710ca8e9878SJed Brown     else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "unrecognized type passed to PCTFS_rvec_non_uniform()!");
711827bd09bSSatish Balay 
7129371c9d4SSatish Balay     arg1 += j;
7139371c9d4SSatish Balay     arg2 += j;
7149371c9d4SSatish Balay     i += j;
715827bd09bSSatish Balay   }
7163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
717827bd09bSSatish Balay }
718827bd09bSSatish Balay 
7197b1ae94cSBarry Smith /***********************************ivec.c*************************************/
PCTFS_rvec_fct_addr(PetscInt type)720d71ae5a4SJacob Faibussowitsch vfp PCTFS_rvec_fct_addr(PetscInt type)
721d71ae5a4SJacob Faibussowitsch {
7224ad8454bSPierre Jolivet   if (type == NON_UNIFORM) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_non_uniform;
7234ad8454bSPierre Jolivet   else if (type == GL_MAX) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_max;
7244ad8454bSPierre Jolivet   else if (type == GL_MIN) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_min;
7254ad8454bSPierre Jolivet   else if (type == GL_MULT) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_mult;
7264ad8454bSPierre Jolivet   else if (type == GL_ADD) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_add;
7274ad8454bSPierre Jolivet   else if (type == GL_MAX_ABS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_max_abs;
7284ad8454bSPierre Jolivet   else if (type == GL_MIN_ABS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_min_abs;
7294ad8454bSPierre Jolivet   else if (type == GL_EXISTS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_exists;
730827bd09bSSatish Balay 
731827bd09bSSatish Balay   /* catch all ... not good if we get here */
7324ad8454bSPierre Jolivet   return NULL;
733827bd09bSSatish Balay }
734