annotate main/sparse/SuperLU/SRC/dsnode_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 "dsp_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 int
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 dsnode_dfs (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 const int jcol, /* in - start of the supernode */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 const int kcol, /* in - end of the supernode */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 const int *asub, /* in */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 const int *xa_begin, /* in */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 const int *xa_end, /* in */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 int *xprune, /* out */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 int *marker, /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 GlobalLU_t *Glu /* modified */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 /* Purpose
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 * =======
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 * dsnode_dfs() - Determine the union of the row structures of those
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 * columns within the relaxed snode.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 * Note: The relaxed snodes are leaves of the supernodal etree, therefore,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 * the portion outside the rectangular supernode must be zero.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 * Return value
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 * ============
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 * 0 success;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 * >0 number of bytes allocated when run out of memory.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 register int i, k, ifrom, ito, nextl, new_next;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 int nsuper, krow, kmark, mem_error;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 int *xsup, *supno;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 int *lsub, *xlsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 int nzlmax;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 xsup = Glu->xsup;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 supno = Glu->supno;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 xlsub = Glu->xlsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 nzlmax = Glu->nzlmax;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 nsuper = ++supno[jcol]; /* Next available supernode number */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 nextl = xlsub[jcol];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 for (i = jcol; i <= kcol; i++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 /* For each nonzero in A[*,i] */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 for (k = xa_begin[i]; k < xa_end[i]; k++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 krow = asub[k];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 kmark = marker[krow];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 if ( kmark != kcol ) { /* First time visit krow */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 marker[krow] = kcol;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 lsub[nextl++] = krow;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 if ( nextl >= nzlmax ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 if ( mem_error = dLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu) )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 return (mem_error);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 supno[i] = nsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 /* Supernode > 1, then make a copy of the subscripts for pruning */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 if ( jcol < kcol ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 new_next = nextl + (nextl - xlsub[jcol]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 while ( new_next > nzlmax ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 if ( mem_error = dLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu) )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 return (mem_error);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 lsub = Glu->lsub;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 ito = nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 for (ifrom = xlsub[jcol]; ifrom < nextl; )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 lsub[ito++] = lsub[ifrom++];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 for (i = jcol+1; i <= kcol; i++) xlsub[i] = nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 nextl = ito;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 xsup[nsuper+1] = kcol + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 supno[kcol+1] = nsuper;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 xprune[kcol] = nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 xlsub[kcol+1] = nextl;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 return 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106