annotate main/sparse/SuperLU/SRC/zgssv.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 #include "zsp_defs.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 #include "util.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 void
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 zgssv(SuperMatrix *A, int *perm_c, int *perm_r, SuperMatrix *L,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 SuperMatrix *U, SuperMatrix *B, int *info )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 * Purpose
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 * =======
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 * ZGSSV solves the system of linear equations A*X=B, using the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 * LU factorization from ZGSTRF. It performs the following steps:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 * 1. If A is stored column-wise (A->Stype = NC):
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 * 1.1. Permute the columns of A, forming A*Pc, where Pc
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 * is a permutation matrix. For more details of this step,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 * see sp_preorder.c.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 * 1.2. Factor A as Pr*A*Pc=L*U with the permutation Pr determined
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 * by Gaussian elimination with partial pivoting.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 * L is unit lower triangular with offdiagonal entries
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 * bounded by 1 in magnitude, and U is upper triangular.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 * 1.3. Solve the system of equations A*X=B using the factored
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 * form of A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 * 2. If A is stored row-wise (A->Stype = NR), apply the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 * above algorithm to the transpose of A:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 * 2.1. Permute columns of transpose(A) (rows of A),
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 * forming transpose(A)*Pc, where Pc is a permutation matrix.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 * For more details of this step, see sp_preorder.c.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 * 2.2. Factor A as Pr*transpose(A)*Pc=L*U with the permutation Pr
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 * determined by Gaussian elimination with partial pivoting.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 * L is unit lower triangular with offdiagonal entries
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 * bounded by 1 in magnitude, and U is upper triangular.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 * 2.3. Solve the system of equations A*X=B using the factored
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 * form of A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 * See supermatrix.h for the definition of 'SuperMatrix' structure.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 * Arguments
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 * =========
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 * A (input) SuperMatrix*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 * Matrix A in A*X=B, of dimension (A->nrow, A->ncol). The number
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 * of linear equations is A->nrow. Currently, the type of A can be:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 * Stype = NC or NR; Dtype = _Z; Mtype = GE. In the future, more
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 * general A will be handled.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 * perm_c (input/output) int*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 * If A->Stype = NC, column permutation vector of size A->ncol
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 * which defines the permutation matrix Pc; perm_c[i] = j means
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 * column i of A is in position j in A*Pc.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 * On exit, perm_c may be overwritten by the product of the input
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 * perm_c and a permutation that postorders the elimination tree
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 * of Pc'*A'*A*Pc; perm_c is not changed if the elimination tree
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 * is already in postorder.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 * If A->Stype = NR, column permutation vector of size A->nrow
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 * which describes permutation of columns of transpose(A)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 * (rows of A) as described above.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 * perm_r (output) int*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 * If A->Stype = NC, row permutation vector of size A->nrow,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 * which defines the permutation matrix Pr, and is determined
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 * by partial pivoting. perm_r[i] = j means row i of A is in
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 * position j in Pr*A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 * If A->Stype = NR, permutation vector of size A->ncol, which
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 * determines permutation of rows of transpose(A)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 * (columns of A) as described above.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 * L (output) SuperMatrix*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 * The factor L from the factorization
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 * Pr*A*Pc=L*U (if A->Stype = NC) or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 * Pr*transpose(A)*Pc=L*U (if A->Stype = NR).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 * Uses compressed row subscripts storage for supernodes, i.e.,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 * L has types: Stype = SC, Dtype = _Z, Mtype = TRLU.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 * U (output) SuperMatrix*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 * The factor U from the factorization
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 * Pr*A*Pc=L*U (if A->Stype = NC) or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 * Pr*transpose(A)*Pc=L*U (if A->Stype = NR).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 * Uses column-wise storage scheme, i.e., U has types:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 * Stype = NC, Dtype = _Z, Mtype = TRU.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 * B (input/output) SuperMatrix*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 * B has types: Stype = DN, Dtype = _Z, Mtype = GE.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 * On entry, the right hand side matrix.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 * On exit, the solution matrix if info = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 * info (output) int*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 * = 0: successful exit
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 * > 0: if info = i, and i is
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109 * <= A->ncol: U(i,i) is exactly zero. The factorization has
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 * been completed, but the factor U is exactly singular,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 * so the solution could not be computed.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112 * > A->ncol: number of bytes allocated when memory allocation
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 * failure occurred, plus A->ncol.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 double t1; /* Temporary time */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 char refact[1], trans[1];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 DNformat *Bstore;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 SuperMatrix *AA; /* A in NC format used by the factorization routine.*/
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 SuperMatrix AC; /* Matrix postmultiplied by Pc */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 int lwork = 0, *etree, i;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 /* Set default values for some parameters */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 double diag_pivot_thresh = 1.0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 double drop_tol = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 int panel_size; /* panel size */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 int relax; /* no of columns in a relaxed snodes */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 double *utime;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129 extern SuperLUStat_t SuperLUStat;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 /* Test the input parameters ... */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 *info = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 Bstore = B->Store;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 if ( A->nrow != A->ncol || A->nrow < 0 ||
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 (A->Stype != NC && A->Stype != NR) ||
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 A->Dtype != _Z || A->Mtype != GE )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 *info = -1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 else if ( B->ncol < 0 || Bstore->lda < MAX(0, A->nrow) ||
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 B->Stype != DN || B->Dtype != _Z || B->Mtype != GE )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140 *info = -6;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 if ( *info != 0 ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 i = -(*info);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 xerbla_("zgssv", &i);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 return;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147 *refact = 'N';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 *trans = 'N';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 panel_size = sp_ienv(1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 relax = sp_ienv(2);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152 StatInit(panel_size, relax);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 utime = SuperLUStat.utime;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 /* Convert A to NC format when necessary. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 if ( A->Stype == NR ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 NRformat *Astore = A->Store;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158 AA = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) );
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 zCreate_CompCol_Matrix(AA, A->ncol, A->nrow, Astore->nnz,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160 Astore->nzval, Astore->colind, Astore->rowptr,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 NC, A->Dtype, A->Mtype);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162 *trans = 'T';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 } else if ( A->Stype == NC ) AA = A;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165 etree = intMalloc(A->ncol);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 t1 = SuperLU_timer_();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168 sp_preorder(refact, AA, perm_c, etree, &AC);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 utime[ETREE] = SuperLU_timer_() - t1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 /*printf("Factor PA = LU ... relax %d\tw %d\tmaxsuper %d\trowblk %d\n",
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172 relax, panel_size, sp_ienv(3), sp_ienv(4));*/
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173 t1 = SuperLU_timer_();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 /* Compute the LU factorization of A. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175 zgstrf(refact, &AC, diag_pivot_thresh, drop_tol, relax, panel_size,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 etree, NULL, lwork, perm_r, perm_c, L, U, info);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 utime[FACT] = SuperLU_timer_() - t1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 t1 = SuperLU_timer_();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180 if ( *info == 0 ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181 /* Solve the system A*X=B, overwriting B with X. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182 zgstrs (trans, L, U, perm_r, perm_c, B, info);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184 utime[SOLVE] = SuperLU_timer_() - t1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 SUPERLU_FREE (etree);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187 Destroy_CompCol_Permuted(&AC);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188 if ( A->Stype == NR ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189 Destroy_SuperMatrix_Store(AA);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 SUPERLU_FREE(AA);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 PrintStat( &SuperLUStat );
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 StatFree();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 }