xref: /petsc/src/mat/graphops/color/impls/minpack/numsrt.c (revision 53673ba54f5aaba04b9d49ab22cf56c7a7461fe9)
1 /* numsrt.f -- translated by f2c (version of 25 March 1992  12:58:56). */
2 
3 #include <../src/mat/graphops/color/impls/minpack/color.h>
4 
MINPACKnumsrt(PetscInt * n,PetscInt * nmax,PetscInt * num,PetscInt * mode,PetscInt * idex,PetscInt * last,PetscInt * next)5 PetscErrorCode MINPACKnumsrt(PetscInt *n, PetscInt *nmax, PetscInt *num, PetscInt *mode, PetscInt *idex, PetscInt *last, PetscInt *next)
6 {
7   /* System generated locals */
8   PetscInt i__1, i__2;
9 
10   /* Local variables */
11   PetscInt jinc, i, j, k, l, jl, ju;
12 
13   /*     Given a sequence of integers, this subroutine groups */
14   /*     together those indices with the same sequence value */
15   /*     and, optionally, sorts the sequence into either */
16   /*     ascending or descending order. */
17   /*     The sequence of integers is defined by the array num, */
18   /*     and it is assumed that the integers are each from the set */
19   /*     0,1,...,nmax. On output the indices k such that num(k) = l */
20   /*     for any l = 0,1,...,nmax can be obtained from the arrays */
21   /*     last and next as follows. */
22   /*           k = last(l) */
23   /*           while (k .ne. 0) k = next(k) */
24   /*     Optionally, the subroutine produces an array index so that */
25   /*     the sequence num(index(i)), i = 1,2,...,n is sorted. */
26   /*     The subroutine statement is */
27   /*       subroutine numsrt(n,nmax,num,mode,index,last,next) */
28   /*     where */
29   /*       n is a positive integer input variable. */
30   /*       nmax is a positive integer input variable. */
31   /*       num is an input array of length n which contains the */
32   /*         sequence of integers to be grouped and sorted. It */
33   /*         is assumed that the integers are each from the set */
34   /*         0,1,...,nmax. */
35   /*       mode is an integer input variable. The sequence num is */
36   /*         sorted in ascending order if mode is positive and in */
37   /*         descending order if mode is negative. If mode is 0, */
38   /*         no sorting is done. */
39   /*       index is an integer output array of length n set so */
40   /*         that the sequence */
41   /*               num(index(i)), i = 1,2,...,n */
42   /*         is sorted according to the setting of mode. If mode */
43   /*         is 0, index is not referenced. */
44   /*       last is an integer output array of length nmax + 1. The */
45   /*         index of num for the last occurrence of l is last(l) */
46   /*         for any l = 0,1,...,nmax unless last(l) = 0. In */
47   /*         this case l does not appear in num. */
48   /*       next is an integer output array of length n. If */
49   /*         num(k) = l, then the index of num for the previous */
50   /*         occurrence of l is next(k) for any l = 0,1,...,nmax */
51   /*         unless next(k) = 0. In this case there is no previous */
52   /*         occurrence of l in num. */
53   /*     Argonne National Laboratory. MINPACK Project. July 1983. */
54   /*     Thomas F. Coleman, Burton S. Garbow, Jorge J. More' */
55 
56   /* Parameter adjustments */
57   PetscFunctionBegin;
58   --next;
59   --idex;
60   --num;
61 
62   i__1 = *nmax;
63   for (i = 0; i <= i__1; ++i) last[i] = 0;
64 
65   i__1 = *n;
66   for (k = 1; k <= i__1; ++k) {
67     l       = num[k];
68     next[k] = last[l];
69     last[l] = k;
70   }
71   if (!*mode) PetscFunctionReturn(PETSC_SUCCESS);
72 
73   /*     Store the pointers to the sorted array in index. */
74 
75   i = 1;
76   if (*mode > 0) {
77     jl   = 0;
78     ju   = *nmax;
79     jinc = 1;
80   } else {
81     jl   = *nmax;
82     ju   = 0;
83     jinc = -1;
84   }
85   i__1 = ju;
86   i__2 = jinc;
87   for (j = jl; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) {
88     k = last[j];
89   L30:
90     if (!k) goto L40;
91     idex[i] = k;
92     ++i;
93     k = next[k];
94     goto L30;
95   L40:;
96   }
97   PetscFunctionReturn(PETSC_SUCCESS);
98 }
99