00001 /* ========================================================================== */ 00002 /* === umfpack_get_symbolic ================================================= */ 00003 /* ========================================================================== */ 00004 00005 /* -------------------------------------------------------------------------- */ 00006 /* UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. */ 00007 /* Davis. All Rights Reserved. See ../README for License. */ 00008 /* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ 00009 /* web: http://www.cise.ufl.edu/research/sparse/umfpack */ 00010 /* -------------------------------------------------------------------------- */ 00011 00012 int umfpack_di_get_symbolic 00013 ( 00014 int *n_row, 00015 int *n_col, 00016 int *n1, 00017 int *nz, 00018 int *nfr, 00019 int *nchains, 00020 int P [ ], 00021 int Q [ ], 00022 int Front_npivcol [ ], 00023 int Front_parent [ ], 00024 int Front_1strow [ ], 00025 int Front_leftmostdesc [ ], 00026 int Chain_start [ ], 00027 int Chain_maxrows [ ], 00028 int Chain_maxcols [ ], 00029 void *Symbolic 00030 ) ; 00031 00032 long umfpack_dl_get_symbolic 00033 ( 00034 long *n_row, 00035 long *n_col, 00036 long *n1, 00037 long *nz, 00038 long *nfr, 00039 long *nchains, 00040 long P [ ], 00041 long Q [ ], 00042 long Front_npivcol [ ], 00043 long Front_parent [ ], 00044 long Front_1strow [ ], 00045 long Front_leftmostdesc [ ], 00046 long Chain_start [ ], 00047 long Chain_maxrows [ ], 00048 long Chain_maxcols [ ], 00049 void *Symbolic 00050 ) ; 00051 00052 int umfpack_zi_get_symbolic 00053 ( 00054 int *n_row, 00055 int *n_col, 00056 int *n1, 00057 int *nz, 00058 int *nfr, 00059 int *nchains, 00060 int P [ ], 00061 int Q [ ], 00062 int Front_npivcol [ ], 00063 int Front_parent [ ], 00064 int Front_1strow [ ], 00065 int Front_leftmostdesc [ ], 00066 int Chain_start [ ], 00067 int Chain_maxrows [ ], 00068 int Chain_maxcols [ ], 00069 void *Symbolic 00070 ) ; 00071 00072 long umfpack_zl_get_symbolic 00073 ( 00074 long *n_row, 00075 long *n_col, 00076 long *n1, 00077 long *nz, 00078 long *nfr, 00079 long *nchains, 00080 long P [ ], 00081 long Q [ ], 00082 long Front_npivcol [ ], 00083 long Front_parent [ ], 00084 long Front_1strow [ ], 00085 long Front_leftmostdesc [ ], 00086 long Chain_start [ ], 00087 long Chain_maxrows [ ], 00088 long Chain_maxcols [ ], 00089 void *Symbolic 00090 ) ; 00091 00092 /* 00093 00094 double int Syntax: 00095 00096 #include "umfpack.h" 00097 int status, n_row, n_col, nz, nfr, nchains, *P, *Q, 00098 *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, 00099 *Chain_start, *Chain_maxrows, *Chain_maxcols ; 00100 void *Symbolic ; 00101 status = umfpack_di_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, 00102 P, Q, Front_npivcol, Front_parent, Front_1strow, 00103 Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, 00104 Symbolic) ; 00105 00106 double long Syntax: 00107 00108 #include "umfpack.h" 00109 long status, n_row, n_col, nz, nfr, nchains, *P, *Q, 00110 *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, 00111 *Chain_start, *Chain_maxrows, *Chain_maxcols ; 00112 void *Symbolic ; 00113 status = umfpack_dl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, 00114 P, Q, Front_npivcol, Front_parent, Front_1strow, 00115 Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, 00116 Symbolic) ; 00117 00118 complex int Syntax: 00119 00120 #include "umfpack.h" 00121 int status, n_row, n_col, nz, nfr, nchains, *P, *Q, 00122 *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, 00123 *Chain_start, *Chain_maxrows, *Chain_maxcols ; 00124 void *Symbolic ; 00125 status = umfpack_zi_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, 00126 P, Q, Front_npivcol, Front_parent, Front_1strow, 00127 Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, 00128 Symbolic) ; 00129 00130 complex long Syntax: 00131 00132 #include "umfpack.h" 00133 long status, n_row, n_col, nz, nfr, nchains, *P, *Q, 00134 *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, 00135 *Chain_start, *Chain_maxrows, *Chain_maxcols ; 00136 void *Symbolic ; 00137 status = umfpack_zl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, 00138 P, Q, Front_npivcol, Front_parent, Front_1strow, 00139 Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, 00140 Symbolic) ; 00141 00142 Purpose: 00143 00144 Copies the contents of the Symbolic object into simple integer arrays 00145 accessible to the user. This routine is not needed to factorize and/or 00146 solve a sparse linear system using UMFPACK. Note that the output arrays 00147 P, Q, Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc, 00148 Chain_start, Chain_maxrows, and Chain_maxcols are not allocated by 00149 umfpack_*_get_symbolic; they must exist on input. 00150 00151 All output arguments are optional. If any of them are NULL 00152 on input, then that part of the symbolic analysis is not copied. You can 00153 use this routine to extract just the parts of the symbolic analysis that 00154 you want. For example, to retrieve just the column permutation Q, use: 00155 00156 #define noI (int *) NULL 00157 status = umfpack_di_get_symbolic (noI, noI, noI, noI, noI, noI, noI, 00158 Q, noI, noI, noI, noI, noI, noI, noI, Symbolic) ; 00159 00160 The only required argument the last one, the pointer to the Symbolic object. 00161 00162 The Symbolic object is small. Its size for an n-by-n square matrix varies 00163 from 4*n to 13*n, depending on the matrix. The object holds the initial 00164 column permutation, the supernodal column elimination tree, and information 00165 about each frontal matrix. You can print it with umfpack_*_report_symbolic. 00166 00167 Returns: 00168 00169 Returns UMFPACK_OK if successful, UMFPACK_ERROR_invalid_Symbolic_object 00170 if Symbolic is an invalid object. 00171 00172 Arguments: 00173 00174 Int *n_row ; Output argument. 00175 Int *n_col ; Output argument. 00176 00177 The dimensions of the matrix A analyzed by the call to 00178 umfpack_*_symbolic that generated the Symbolic object. 00179 00180 Int *n1 ; Output argument. 00181 00182 The number of pivots with zero Markowitz cost (they have just one entry 00183 in the pivot row, or the pivot column, or both). These appear first in 00184 the output permutations P and Q. 00185 00186 NOTE: this argument is new to version 4.1. 00187 00188 Int *nz ; Output argument. 00189 00190 The number of nonzeros in A. 00191 00192 Int *nfr ; Output argument. 00193 00194 The number of frontal matrices that will be used by umfpack_*_numeric 00195 to factorize the matrix A. It is in the range 0 to n_col. 00196 00197 Int *nchains ; Output argument. 00198 00199 The frontal matrices are related to one another by the supernodal 00200 column elimination tree. Each node in this tree is one frontal matrix. 00201 The tree is partitioned into a set of disjoint paths, and a frontal 00202 matrix chain is one path in this tree. Each chain is factorized using 00203 a unifrontal technique, with a single working array that holds each 00204 frontal matrix in the chain, one at a time. nchains is in the range 00205 0 to nfr. 00206 00207 Int P [n_row] ; Output argument. 00208 00209 The initial row permutation. If P [k] = i, then this means that 00210 row i is the kth row in the pre-ordered matrix. In general, this P is 00211 not the same as the final row permutation computed by umfpack_*_numeric. 00212 00213 For the unsymmetric strategy, P defines the row-merge order. Let j be 00214 the column index of the leftmost nonzero entry in row i of A*Q. Then 00215 P defines a sort of the rows according to this value. A row can appear 00216 earlier in this ordering if it is aggressively absorbed before it can 00217 become a pivot row. If P [k] = i, row i typically will not be the kth 00218 pivot row. 00219 00220 For the symmetric strategy, P = Q. For the 2-by-2 strategy, P is the 00221 row permutation that places large entries on the diagonal of P*A*Q. 00222 If no pivoting occurs during numerical factorization, P [k] = i also 00223 defines the final permutation of umfpack_*_numeric, for either the 00224 symmetric or 2-by-2 strategies. 00225 00226 Int Q [n_col] ; Output argument. 00227 00228 The initial column permutation. If Q [k] = j, then this means that 00229 column j is the kth pivot column in the pre-ordered matrix. Q is 00230 not necessarily the same as the final column permutation Q, computed by 00231 umfpack_*_numeric. The numeric factorization may reorder the pivot 00232 columns within each frontal matrix to reduce fill-in. If the matrix is 00233 structurally singular, and if the symmetric or 2-by-2 strategies or 00234 used (or if Control [UMFPACK_FIXQ] > 0), then this Q will be the same 00235 as the final column permutation computed in umfpack_*_numeric. 00236 00237 Int Front_npivcol [n_col+1] ; Output argument. 00238 00239 This array should be of size at least n_col+1, in order to guarantee 00240 that it will be large enough to hold the output. Only the first nfr+1 00241 entries are used, however. 00242 00243 The kth frontal matrix holds Front_npivcol [k] pivot columns. Thus, the 00244 first frontal matrix, front 0, is used to factorize the first 00245 Front_npivcol [0] columns; these correspond to the original columns 00246 Q [0] through Q [Front_npivcol [0]-1]. The next frontal matrix 00247 is used to factorize the next Front_npivcol [1] columns, which are thus 00248 the original columns Q [Front_npivcol [0]] through 00249 Q [Front_npivcol [0] + Front_npivcol [1] - 1], and so on. Columns 00250 with no entries at all are put in a placeholder "front", 00251 Front_npivcol [nfr]. The sum of Front_npivcol [0..nfr] is equal to 00252 n_col. 00253 00254 Any modifications that umfpack_*_numeric makes to the initial column 00255 permutation are constrained to within each frontal matrix. Thus, for 00256 the first frontal matrix, Q [0] through Q [Front_npivcol [0]-1] is some 00257 permutation of the columns Q [0] through 00258 Q [Front_npivcol [0]-1]. For second frontal matrix, 00259 Q [Front_npivcol [0]] through Q [Front_npivcol [0] + Front_npivcol[1]-1] 00260 is some permutation of the same portion of Q, and so on. All pivot 00261 columns are numerically factorized within the frontal matrix originally 00262 determined by the symbolic factorization; there is no delayed pivoting 00263 across frontal matrices. 00264 00265 Int Front_parent [n_col+1] ; Output argument. 00266 00267 This array should be of size at least n_col+1, in order to guarantee 00268 that it will be large enough to hold the output. Only the first nfr+1 00269 entries are used, however. 00270 00271 Front_parent [0..nfr] holds the supernodal column elimination tree 00272 (including the placeholder front nfr, which may be empty). Each node in 00273 the tree corresponds to a single frontal matrix. The parent of node f 00274 is Front_parent [f]. 00275 00276 Int Front_1strow [n_col+1] ; Output argument. 00277 00278 This array should be of size at least n_col+1, in order to guarantee 00279 that it will be large enough to hold the output. Only the first nfr+1 00280 entries are used, however. 00281 00282 Front_1strow [k] is the row index of the first row in A (P,Q) 00283 whose leftmost entry is in a pivot column for the kth front. This is 00284 necessary only to properly factorize singular matrices. It is new to 00285 Version 4.0. Rows in the range Front_1strow [k] to 00286 Front_1strow [k+1]-1 first become pivot row candidates at the kth front. 00287 Any rows not eliminated in the kth front may be selected as pivot rows 00288 in the parent of k (Front_parent [k]) and so on up the tree. 00289 00290 Int Front_leftmostdesc [n_col+1] ; Output argument. 00291 00292 This array should be of size at least n_col+1, in order to guarantee 00293 that it will be large enough to hold the output. Only the first nfr+1 00294 entries are used, however. 00295 00296 Front_leftmostdesc [k] is the leftmost descendant of front k, or k 00297 if the front has no children in the tree. Since the rows and columns 00298 (P and Q) have been post-ordered via a depth-first-search of 00299 the tree, rows in the range Front_1strow [Front_leftmostdesc [k]] to 00300 Front_1strow [k+1]-1 form the entire set of candidate pivot rows for 00301 the kth front (some of these will typically have already been selected 00302 by fronts in the range Front_leftmostdesc [k] to front k-1, before 00303 the factorization reaches front k). 00304 00305 Chain_start [n_col+1] ; Output argument. 00306 00307 This array should be of size at least n_col+1, in order to guarantee 00308 that it will be large enough to hold the output. Only the first 00309 nchains+1 entries are used, however. 00310 00311 The kth frontal matrix chain consists of frontal matrices Chain_start[k] 00312 through Chain_start [k+1]-1. Thus, Chain_start [0] is always 0, and 00313 Chain_start [nchains] is the total number of frontal matrices, nfr. For 00314 two adjacent fronts f and f+1 within a single chain, f+1 is always the 00315 parent of f (that is, Front_parent [f] = f+1). 00316 00317 Int Chain_maxrows [n_col+1] ; Output argument. 00318 Int Chain_maxcols [n_col+1] ; Output argument. 00319 00320 These arrays should be of size at least n_col+1, in order to guarantee 00321 that they will be large enough to hold the output. Only the first 00322 nchains entries are used, however. 00323 00324 The kth frontal matrix chain requires a single working array of 00325 dimension Chain_maxrows [k] by Chain_maxcols [k], for the unifrontal 00326 technique that factorizes the frontal matrix chain. Since the symbolic 00327 factorization only provides an upper bound on the size of each frontal 00328 matrix, not all of the working array is necessarily used during the 00329 numerical factorization. 00330 00331 Note that the upper bound on the number of rows and columns of each 00332 frontal matrix is computed by umfpack_*_symbolic, but all that is 00333 required by umfpack_*_numeric is the maximum of these two sets of 00334 values for each frontal matrix chain. Thus, the size of each 00335 individual frontal matrix is not preserved in the Symbolic object. 00336 00337 void *Symbolic ; Input argument, not modified. 00338 00339 The Symbolic object, which holds the symbolic factorization computed by 00340 umfpack_*_symbolic. The Symbolic object is not modified by 00341 umfpack_*_get_symbolic. 00342 */