00001 /* ========================================================================== */ 00002 /* === umfpack_get_numeric ================================================== */ 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_numeric 00013 ( 00014 int Lp [ ], 00015 int Lj [ ], 00016 double Lx [ ], 00017 int Up [ ], 00018 int Ui [ ], 00019 double Ux [ ], 00020 int P [ ], 00021 int Q [ ], 00022 double Dx [ ], 00023 int *do_recip, 00024 double Rs [ ], 00025 void *Numeric 00026 ) ; 00027 00028 long umfpack_dl_get_numeric 00029 ( 00030 long Lp [ ], 00031 long Lj [ ], 00032 double Lx [ ], 00033 long Up [ ], 00034 long Ui [ ], 00035 double Ux [ ], 00036 long P [ ], 00037 long Q [ ], 00038 double Dx [ ], 00039 long *do_recip, 00040 double Rs [ ], 00041 void *Numeric 00042 ) ; 00043 00044 int umfpack_zi_get_numeric 00045 ( 00046 int Lp [ ], 00047 int Lj [ ], 00048 double Lx [ ], double Lz [ ], 00049 int Up [ ], 00050 int Ui [ ], 00051 double Ux [ ], double Uz [ ], 00052 int P [ ], 00053 int Q [ ], 00054 double Dx [ ], double Dz [ ], 00055 int *do_recip, 00056 double Rs [ ], 00057 void *Numeric 00058 ) ; 00059 00060 long umfpack_zl_get_numeric 00061 ( 00062 long Lp [ ], 00063 long Lj [ ], 00064 double Lx [ ], double Lz [ ], 00065 long Up [ ], 00066 long Ui [ ], 00067 double Ux [ ], double Uz [ ], 00068 long P [ ], 00069 long Q [ ], 00070 double Dx [ ], double Dz [ ], 00071 long *do_recip, 00072 double Rs [ ], 00073 void *Numeric 00074 ) ; 00075 00076 /* 00077 double int Syntax: 00078 00079 #include "umfpack.h" 00080 void *Numeric ; 00081 int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; 00082 double *Lx, *Ux, *Dx, *Rs ; 00083 status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, 00084 &do_recip, Rs, Numeric) ; 00085 00086 double long Syntax: 00087 00088 #include "umfpack.h" 00089 void *Numeric ; 00090 long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; 00091 double *Lx, *Ux, *Dx, *Rs ; 00092 status = umfpack_dl_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, 00093 &do_recip, Rs, Numeric) ; 00094 00095 complex int Syntax: 00096 00097 #include "umfpack.h" 00098 void *Numeric ; 00099 int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; 00100 double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ; 00101 status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, 00102 Dx, Dz, &do_recip, Rs, Numeric) ; 00103 00104 complex long Syntax: 00105 00106 #include "umfpack.h" 00107 void *Numeric ; 00108 long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; 00109 double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ; 00110 status = umfpack_zl_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, 00111 Dx, Dz, &do_recip, Rs, Numeric) ; 00112 00113 Purpose: 00114 00115 This routine copies the LU factors and permutation vectors from the Numeric 00116 object into user-accessible arrays. This routine is not needed to solve a 00117 linear system. Note that the output arrays Lp, Lj, Lx, Up, Ui, Ux, P, Q, 00118 Dx, and Rs are not allocated by umfpack_*_get_numeric; they must exist on 00119 input. Similarly, Lz, Uz and Dz must exist on input for the complex 00120 versions. 00121 00122 All output arguments are optional. If any of them are NULL 00123 on input, then that part of the LU factorization is not copied. You can 00124 use this routine to extract just the parts of the LU factorization that 00125 you want. For example, to retrieve just the column permutation Q, use: 00126 00127 #define noD (double *) NULL 00128 #define noI (int *) NULL 00129 status = umfpack_di_get_numeric (noI, noI, noD, noI, noI, noD, noI, 00130 Q, noD, noI, noD, Numeric) ; 00131 00132 Returns: 00133 00134 Returns UMFPACK_OK if successful. Returns UMFPACK_ERROR_out_of_memory 00135 if insufficient memory is available for the 2*max(n_row,n_col) integer 00136 workspace that umfpack_*_get_numeric allocates to construct L and/or U. 00137 Returns UMFPACK_ERROR_invalid_Numeric_object if the Numeric object provided 00138 as input is invalid. 00139 00140 Arguments: 00141 00142 Int Lp [n_row+1] ; Output argument. 00143 Int Lj [lnz] ; Output argument. 00144 double Lx [lnz] ; Output argument. 00145 double Lz [lnz] ; Output argument for complex versions. 00146 00147 The n_row-by-min(n_row,n_col) matrix L is returned in compressed-row 00148 form. The column indices of row i and corresponding numerical values 00149 are in: 00150 00151 Lj [Lp [i] ... Lp [i+1]-1] 00152 Lx [Lp [i] ... Lp [i+1]-1] real part 00153 Lz [Lp [i] ... Lp [i+1]-1] imaginary part (complex versions) 00154 00155 respectively. Each row is stored in sorted order, from low column 00156 indices to higher. The last entry in each row is the diagonal, which 00157 is numerically equal to one. The sizes of Lp, Lj, Lx, and Lz are 00158 returned by umfpack_*_get_lunz. If Lp, Lj, or Ux (or Uz for the 00159 complex version) are not present, then the matrix L is not returned. 00160 This is not an error condition. The L matrix can be printed if n_row, 00161 Lp, Lj, Lx (and Lz for the complex versions) are passed to 00162 umfpack_*_report_matrix (using the "row" form). 00163 00164 Future complex version: if Lx is present and Lz is NULL, then both real 00165 and imaginary parts will be returned in Lx[0..2*lnz-1], with Lx[2*k] 00166 and Lx[2*k+1] being the real and imaginary part of the kth entry. 00167 00168 Int Up [n_col+1] ; Output argument. 00169 Int Ui [unz] ; Output argument. 00170 double Ux [unz] ; Output argument. 00171 double Uz [unz] ; Output argument for complex versions. 00172 00173 The min(n_row,n_col)-by-n_col matrix U is returned in compressed-column 00174 form. The row indices of column j and corresponding numerical values 00175 are in 00176 00177 Ui [Up [j] ... Up [j+1]-1] 00178 Ux [Up [j] ... Up [j+1]-1] real part 00179 Uz [Up [j] ... Up [j+1]-1] imaginary part (complex versions) 00180 00181 respectively. Each column is stored in sorted order, from low row 00182 indices to higher. The last entry in each column is the diagonal 00183 (assuming that it is nonzero). The sizes of Up, Ui, Ux, and Uz are 00184 returned by umfpack_*_get_lunz. If Up, Ui, or Ux (or Uz for the complex 00185 version) are not present, then the matrix U is not returned. This is 00186 not an error condition. The U matrix can be printed if n_col, Up, Ui, 00187 Ux (and Uz for the complex versions) are passed to 00188 umfpack_*_report_matrix (using the "column" form). 00189 00190 Future complex version: if Ux is present and Uz is NULL, then both real 00191 and imaginary parts will be returned in Ux[0..2*unz-1], with Ux[2*k] 00192 and Ux[2*k+1] being the real and imaginary part of the kth entry. 00193 00194 Int P [n_row] ; Output argument. 00195 00196 The permutation vector P is defined as P [k] = i, where the original 00197 row i of A is the kth pivot row in PAQ. If you do not want the P vector 00198 to be returned, simply pass (Int *) NULL for P. This is not an error 00199 condition. You can print P and Q with umfpack_*_report_perm. 00200 00201 Int Q [n_col] ; Output argument. 00202 00203 The permutation vector Q is defined as Q [k] = j, where the original 00204 column j of A is the kth pivot column in PAQ. If you not want the Q 00205 vector to be returned, simply pass (Int *) NULL for Q. This is not 00206 an error condition. Note that Q is not necessarily identical to 00207 Qtree, the column pre-ordering held in the Symbolic object. Refer to 00208 the description of Qtree and Front_npivcol in umfpack_*_get_symbolic for 00209 details. 00210 00211 double Dx [min(n_row,n_col)] ; Output argument. 00212 double Dz [min(n_row,n_col)] ; Output argument for complex versions. 00213 00214 The diagonal of U is also returned in Dx and Dz. You can extract the 00215 diagonal of U without getting all of U by passing a non-NULL Dx (and 00216 Dz for the complex version) and passing Up, Ui, and Ux as NULL. Dx is 00217 the real part of the diagonal, and Dz is the imaginary part. 00218 00219 Future complex version: if Dx is present and Dz is NULL, then both real 00220 and imaginary parts will be returned in Dx[0..2*min(n_row,n_col)-1], 00221 with Dx[2*k] and Dx[2*k+1] being the real and imaginary part of the kth 00222 entry. 00223 00224 Int *do_recip ; Output argument. 00225 00226 If do_recip is returned as zero (false), then the scale factors Rs [i] 00227 are to be used by multiplying row i by Rs [i]. Otherwise, the entries 00228 in row i are to be divided by Rs [i]. 00229 00230 If UMFPACK has been compiled with gcc, or for MATLAB as either a 00231 built-in routine or as a mexFunction, then the NRECIPROCAL flag is 00232 set, and do_recip will always be zero (false). 00233 00234 NOTE: this argument is new to version 4.1. 00235 00236 double Rs [n_row] ; Output argument. 00237 00238 The row scale factors are returned in Rs [0..n_row-1]. Row i of A is 00239 scaled by dividing or multiplying its values by Rs [i]. If default 00240 scaling is in use, Rs [i] is the sum of the absolute values of row i 00241 (or its reciprocal). If max row scaling is in use, then Rs [i] is the 00242 maximum absolute value in row i (or its reciprocal). 00243 Otherwise, Rs [i] = 1. If row i is all zero, Rs [i] = 1 as well. For 00244 the complex version, an approximate absolute value is used 00245 (|x_real|+|x_imag|). 00246 00247 NOTE: this argument is new to version 4.1. 00248 00249 void *Numeric ; Input argument, not modified. 00250 00251 Numeric must point to a valid Numeric object, computed by 00252 umfpack_*_numeric. 00253 */