35 double temp, max_ai, max_ui, min_block_rgrowth ;
37 Int *Q, *Ui, *Uip, *Ulen, *Pinv ;
39 Entry *Aentry, *Ux, *Ukk ;
41 Int i, newrow, oldrow, k1, k2, nk, j, oldcol, k, pend, len ;
71 Aentry = (
Entry *) Ax ;
72 Pinv = Numeric->Pinv ;
77 for (i = 0 ; i < Symbolic->nblocks ; i++)
80 k2 = Symbolic->R[i+1] ;
86 LU = (
Unit *) Numeric->LUbx[i] ;
87 Uip = Numeric->Uip + k1 ;
88 Ulen = Numeric->Ulen + k1 ;
89 Ukk = ((
Entry *) Numeric->Udiag) + k1 ;
90 min_block_rgrowth = 1 ;
91 for (j = 0 ; j < nk ; j++)
96 pend = Ap [oldcol + 1] ;
97 for (k = Ap [oldcol] ; k < pend ; k++)
100 newrow = Pinv [oldrow] ;
124 for (k = 0 ; k < len ; k++)
134 ABS (temp, Ukk [j]) ;
145 temp = max_ai / max_ui ;
146 if (temp < min_block_rgrowth)
148 min_block_rgrowth = temp ;
152 if (min_block_rgrowth < Common->
rgrowth)
154 Common->rgrowth = min_block_rgrowth ;
179 double xj, Xmax, csum, anorm, ainv_norm, est_old, est_new, abs_value ;
180 Entry *Udiag, *Aentry, *X, *S ;
182 Int nblocks, i, j, jmax, jnew, pend,
n ;
204 Common->condest = 1 / abs_value ;
215 nblocks = Symbolic->nblocks ;
217 Udiag = Numeric->Udiag ;
223 for (i = 0 ; i < n ; i++)
225 ABS (abs_value, Udiag [i]) ;
228 Common->condest = 1 / abs_value ;
239 Aentry = (
Entry *) Ax ;
240 for (i = 0 ; i < n ; i++)
244 for (j = Ap [i] ; j < pend ; j++)
246 ABS (abs_value, Aentry [j]) ;
264 for (i = 0 ; i < n ; i++)
268 REAL (X [i]) = 1.0 / ((double) n) ;
273 for (i = 0 ; i < 5 ; i++)
278 for (j = 0 ; j < n ; j++)
283 REAL (X [jmax]) = 1 ;
286 KLU_solve (Symbolic, Numeric, n, 1, (
double *) X, Common) ;
287 est_old = ainv_norm ;
290 for (j = 0 ; j < n ; j++)
293 ABS (abs_value, X [j]) ;
294 ainv_norm += abs_value ;
300 for (j = 0 ; j < n ; j++)
302 double s = (X [j] >= 0) ? 1 : -1 ;
310 if (i > 0 && (ainv_norm <= est_old || unchanged))
315 for (j = 0 ; j < n ; j++)
319 ABS (abs_value, X [j]) ;
329 if (i > 0 && ainv_norm <= est_old)
335 for (j = 0 ; j < n ; j++)
342 KLU_tsolve (Symbolic, Numeric, n, 1, X, Common) ;
345 KLU_tsolve (Symbolic, Numeric, n, 1, (
double *) X, 1, Common) ;
351 for (j = 0 ; j < n ; j++)
361 if (i > 0 && jnew == jmax)
374 for (j = 0 ; j < n ; j++)
379 REAL (X [j]) = 1 + ((double) j) / ((double) (n-1)) ;
383 REAL (X [j]) = -1 - ((double) j) / ((double) (n-1)) ;
387 KLU_solve (Symbolic, Numeric, n, 1, (
double *) X, Common) ;
390 for (j = 0 ; j < n ; j++)
393 ABS (abs_value, X [j]) ;
394 est_new += abs_value ;
396 est_new = 2 * est_new / (3 * n) ;
397 ainv_norm =
MAX (est_new, ainv_norm) ;
403 Common->condest = ainv_norm * anorm ;
422 Int *R, *Ui, *Uip, *Llen, *Ulen ;
425 Int k, ulen, p,
n, nk, block, nblocks, k1 ;
435 Common->flops =
EMPTY ;
436 if (Numeric ==
NULL || Symbolic ==
NULL)
449 nblocks = Symbolic->nblocks ;
455 LUbx = (
Unit **) Numeric->LUbx ;
461 for (block = 0 ; block < nblocks ; block++)
464 nk = R [block+1] - k1 ;
467 Llen = Numeric->Llen + k1 ;
468 Uip = Numeric->Uip + k1 ;
469 Ulen = Numeric->Ulen + k1 ;
471 for (k = 0 ; k < nk ; k++)
476 for (p = 0 ; p < ulen ; p++)
478 flops += 2 * Llen [Ui [p]] ;
485 Common->flops =
flops ;
506 double ukk, umin, umax ;
518 if (Symbolic ==
NULL)
536 Udiag = Numeric->Udiag ;
537 for (j = 0 ; j < n ; j++)
540 ABS (ukk, Udiag [j]) ;
557 umin =
MIN (umin, ukk) ;
558 umax =
MAX (umax, ukk) ;
562 Common->rcond = umin / umax ;
#define GET_POINTER(LU, Xip, Xlen, Xi, Xx, k, xlen)
Int KLU_rgrowth(Int *Ap, Int *Ai, double *Ax, KLU_symbolic *Symbolic, KLU_numeric *Numeric, KLU_common *Common)
#define SCALAR_IS_ZERO(x)
#define GET_I_POINTER(LU, Xip, Xi, k)
#define ASSERT(expression)
Int KLU_rcond(KLU_symbolic *Symbolic, KLU_numeric *Numeric, KLU_common *Common)
#define SCALE_DIV_ASSIGN(a, c, s)
Int KLU_tsolve(KLU_symbolic *Symbolic, KLU_numeric *Numeric, Int d, Int nrhs, double B[], KLU_common *Common)
Int KLU_flops(KLU_symbolic *Symbolic, KLU_numeric *Numeric, KLU_common *Common)
Int KLU_condest(Int Ap[], double Ax[], KLU_symbolic *Symbolic, KLU_numeric *Numeric, KLU_common *Common)