annotate main/sparse/SuperLU/SRC/zcolumn_dfs.c @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 7dad48fc229c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 * -- SuperLU routine (version 2.0) --
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 * Univ. of California Berkeley, Xerox Palo Alto Research Center,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 * and Lawrence Berkeley National Lab.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 * November 15, 1997
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 Copyright (c) 1994 by Xerox Corporation. All rights reserved.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 Permission is hereby granted to use or copy this program for any
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 purpose, provided the above notices are retained on all copies.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 Permission to modify the code and to distribute modified code is
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 granted, provided the above notices are retained, and a notice that
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 the code was modified is included with the above copyright notice.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 #include "zsp_defs.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 #include "util.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 /* What type of supernodes we want */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 #define T2_SUPER
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 int
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 zcolumn_dfs(
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 const int m, /* in - number of rows in the matrix */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 const int jcol, /* in */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 int *perm_r, /* in */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 int *nseg, /* modified - with new segments appended */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 int *lsub_col, /* in - defines the RHS vector to start the dfs */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 int *segrep, /* modified - with new segments appended */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 int *repfnz, /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 int *xprune, /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 int *marker, /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 int *parent, /* working array */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 int *xplore, /* working array */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 GlobalLU_t *Glu /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 * Purpose
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 * =======
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 * "column_dfs" performs a symbolic factorization on column jcol, and
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 * decide the supernode boundary.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 * This routine does not use numeric values, but only use the RHS
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 * row indices to start the dfs.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 * A supernode representative is the last column of a supernode.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 * The nonzeros in U[*,j] are segments that end at supernodal
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 * representatives. The routine returns a list of such supernodal
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 * representatives in topological order of the dfs that generates them.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 * The location of the first nonzero in each such supernodal segment
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 * (supernodal entry location) is also returned.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 * Local parameters
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 * ================
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 * nseg: no of segments in current U[*,j]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 * jsuper: jsuper=NO if column j does not belong to the same
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 * supernode as j-1. Otherwise, jsuper=nsuper.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 * marker2: A-row --> A-row/col (0/1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 * repfnz: SuperA-col --> PA-row
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 * parent: SuperA-col --> SuperA-col
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 * xplore: SuperA-col --> index to L-structure
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 * Return value
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 * ============
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 * 0 success;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 * > 0 number of bytes allocated when run out of space.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 int jcolp1, jcolm1, jsuper, nsuper, nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 int k, krep, krow, kmark, kperm;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 int *marker2; /* Used for small panel LU */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 int fsupc; /* First column of a snode */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 int myfnz; /* First nonz column of a U-segment */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 int chperm, chmark, chrep, kchild;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 int xdfs, maxdfs, kpar, oldrep;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 int jptr, jm1ptr;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 int ito, ifrom, istop; /* Used to compress row subscripts */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 int mem_error;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 int *xsup, *supno, *lsub, *xlsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 int nzlmax;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 static int first = 1, maxsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 xsup = Glu->xsup;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 supno = Glu->supno;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 xlsub = Glu->xlsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 nzlmax = Glu->nzlmax;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 if ( first ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 maxsuper = sp_ienv(3);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 first = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 jcolp1 = jcol + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 jcolm1 = jcol - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 nsuper = supno[jcol];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 jsuper = nsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 nextl = xlsub[jcol];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 marker2 = &marker[2*m];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 /* For each nonzero in A[*,jcol] do dfs */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 for (k = 0; lsub_col[k] != EMPTY; k++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 krow = lsub_col[k];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 lsub_col[k] = EMPTY;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 kmark = marker2[krow];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 /* krow was visited before, go to the next nonz */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 if ( kmark == jcol ) continue;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 /* For each unmarked nbr krow of jcol
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 * krow is in L: place it in structure of L[*,jcol]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 marker2[krow] = jcol;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 kperm = perm_r[krow];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 if ( kperm == EMPTY ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 lsub[nextl++] = krow; /* krow is indexed into A */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 if ( nextl >= nzlmax ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129 if ( mem_error = zLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu) )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 return (mem_error);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 if ( kmark != jcolm1 ) jsuper = NO; /* Row index subset testing */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 /* krow is in U: if its supernode-rep krep
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 * has been explored, update repfnz[*]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 krep = xsup[supno[kperm]+1] - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 myfnz = repfnz[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 if ( myfnz != EMPTY ) { /* Visited before */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 if ( myfnz > kperm ) repfnz[krep] = kperm;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 /* continue; */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 /* Otherwise, perform dfs starting at krep */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147 oldrep = EMPTY;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 parent[krep] = oldrep;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 repfnz[krep] = kperm;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 xdfs = xlsub[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151 maxdfs = xprune[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 do {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 * For each unmarked kchild of krep
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 while ( xdfs < maxdfs ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 kchild = lsub[xdfs];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160 xdfs++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 chmark = marker2[kchild];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 if ( chmark != jcol ) { /* Not reached yet */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164 marker2[kchild] = jcol;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165 chperm = perm_r[kchild];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 /* Case kchild is in L: place it in L[*,k] */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168 if ( chperm == EMPTY ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 lsub[nextl++] = kchild;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170 if ( nextl >= nzlmax ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 if ( mem_error =
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172 zLUMemXpand(jcol,nextl,LSUB,&nzlmax,Glu) )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173 return (mem_error);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 if ( chmark != jcolm1 ) jsuper = NO;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178 /* Case kchild is in U:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 * chrep = its supernode-rep. If its rep has
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180 * been explored, update its repfnz[*]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182 chrep = xsup[supno[chperm]+1] - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183 myfnz = repfnz[chrep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184 if ( myfnz != EMPTY ) { /* Visited before */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185 if ( myfnz > chperm )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 repfnz[chrep] = chperm;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188 /* Continue dfs at super-rep of kchild */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189 xplore[krep] = xdfs;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 oldrep = krep;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 krep = chrep; /* Go deeper down G(L^t) */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192 parent[krep] = oldrep;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 repfnz[krep] = chperm;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 xdfs = xlsub[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195 maxdfs = xprune[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 } /* else */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
197
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
198 } /* else */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
199
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
200 } /* if */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
201
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
202 } /* while */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
203
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
204 /* krow has no more unexplored nbrs;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
205 * place supernode-rep krep in postorder DFS.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
206 * backtrack dfs to its parent
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
207 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
208 segrep[*nseg] = krep;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
209 ++(*nseg);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
210 kpar = parent[krep]; /* Pop from stack, mimic recursion */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
211 if ( kpar == EMPTY ) break; /* dfs done */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
212 krep = kpar;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
213 xdfs = xplore[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
214 maxdfs = xprune[krep];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
215
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
216 } while ( kpar != EMPTY ); /* Until empty stack */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
217
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
218 } /* else */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
219
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
220 } /* else */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
221
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
222 } /* for each nonzero ... */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
223
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
224 /* Check to see if j belongs in the same supernode as j-1 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
225 if ( jcol == 0 ) { /* Do nothing for column 0 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
226 nsuper = supno[0] = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
227 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
228 fsupc = xsup[nsuper];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
229 jptr = xlsub[jcol]; /* Not compressed yet */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
230 jm1ptr = xlsub[jcolm1];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
231
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
232 #ifdef T2_SUPER
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
233 if ( (nextl-jptr != jptr-jm1ptr-1) ) jsuper = NO;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
234 #endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
235 /* Make sure the number of columns in a supernode doesn't
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
236 exceed threshold. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
237 if ( jcol - fsupc >= maxsuper ) jsuper = NO;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
238
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
239 /* If jcol starts a new supernode, reclaim storage space in
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
240 * lsub from the previous supernode. Note we only store
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
241 * the subscript set of the first and last columns of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
242 * a supernode. (first for num values, last for pruning)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
243 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
244 if ( jsuper == NO ) { /* starts a new supernode */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
245 if ( (fsupc < jcolm1-1) ) { /* >= 3 columns in nsuper */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
246 #ifdef CHK_COMPRESS
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
247 printf(" Compress lsub[] at super %d-%d\n", fsupc, jcolm1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
248 #endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
249 ito = xlsub[fsupc+1];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
250 xlsub[jcolm1] = ito;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
251 istop = ito + jptr - jm1ptr;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
252 xprune[jcolm1] = istop; /* Initialize xprune[jcol-1] */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
253 xlsub[jcol] = istop;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
254 for (ifrom = jm1ptr; ifrom < nextl; ++ifrom, ++ito)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
255 lsub[ito] = lsub[ifrom];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
256 nextl = ito; /* = istop + length(jcol) */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
257 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
258 nsuper++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
259 supno[jcol] = nsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
260 } /* if a new supernode */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
261
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
262 } /* else: jcol > 0 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
263
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
264 /* Tidy up the pointers before exit */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
265 xsup[nsuper+1] = jcolp1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
266 supno[jcolp1] = nsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
267 xprune[jcol] = nextl; /* Initialize upper bound for pruning */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
268 xlsub[jcolp1] = nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
269
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
270 return 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
271 }