104 double maxlnz, dunits ;
106 Int *Pinv, *Lpend, *Stack, *Flag, *Ap_pos, *W ;
107 Int lsize, usize, anz, ok ;
116 anz = Ap [
n+k1] - Ap [k1] ;
121 Lsize =
MAX (Lsize, 1.0) ;
122 lsize = Lsize * anz +
n ;
131 lsize =
MAX (
n+1, lsize) ;
132 usize =
MAX (
n+1, usize) ;
134 maxlnz = (((double)
n) * ((double)
n) + ((double) n)) / 2. ;
135 maxlnz =
MIN (maxlnz, ((
double) INT_MAX)) ;
136 lsize =
MIN (maxlnz, lsize) ;
137 usize =
MIN (maxlnz, usize) ;
139 PRINTF ((
"Welcome to klu: n %d anz %d k1 %d lsize %d usize %d maxlnz %g\n",
140 n, anz, k1, lsize, usize, maxlnz)) ;
151 Pinv = (
Int *) W ; W += n ;
152 Stack = (
Int *) W ; W += n ;
153 Flag = (
Int *) W ; W += n ;
154 Lpend = (
Int *) W ; W += n ;
155 Ap_pos = (
Int *) W ; W += n ;
159 lusize = (size_t) dunits ;
175 lusize =
KLU_kernel (n, Ap, Ai, Ax, Q, lusize,
176 Pinv,
P, &LU, Udiag, Llen, Ulen, Lip, Uip, lnz, unz,
177 X, Stack, Flag, Ap_pos, Lpend,
178 k1, PSinv, Rs, Offp, Offi, Offx, Common) ;
184 if (Common->status <
KLU_OK)
190 PRINTF ((
" in klu noffdiag %d\n", Common->noffdiag)) ;
225 for (k = 0 ; k < n ; k++)
230 for (p = 0 ; p < len ; p++)
233 MULT_SUB (X [Li [p]], Lx [p], x [0]) ;
240 for (k = 0 ; k < n ; k++)
243 x [1] = X [2*k + 1] ;
245 for (p = 0 ; p < len ; p++)
250 MULT_SUB (X [2*i + 1], lik, x [1]) ;
257 for (k = 0 ; k < n ; k++)
260 x [1] = X [3*k + 1] ;
261 x [2] = X [3*k + 2] ;
263 for (p = 0 ; p < len ; p++)
268 MULT_SUB (X [3*i + 1], lik, x [1]) ;
269 MULT_SUB (X [3*i + 2], lik, x [2]) ;
276 for (k = 0 ; k < n ; k++)
279 x [1] = X [4*k + 1] ;
280 x [2] = X [4*k + 2] ;
281 x [3] = X [4*k + 3] ;
283 for (p = 0 ; p < len ; p++)
288 MULT_SUB (X [4*i + 1], lik, x [1]) ;
289 MULT_SUB (X [4*i + 2], lik, x [2]) ;
290 MULT_SUB (X [4*i + 3], lik, x [3]) ;
320 Entry x [4], uik, ukk ;
330 for (k = n-1 ; k >= 0 ; k--)
334 DIV (x [0], X [k], Udiag [k]) ;
336 for (p = 0 ; p < len ; p++)
339 MULT_SUB (X [Ui [p]], Ux [p], x [0]) ;
348 for (k = n-1 ; k >= 0 ; k--)
354 DIV (x [0], X [2*k], ukk) ;
355 DIV (x [1], X [2*k + 1], ukk) ;
358 X [2*k + 1] = x [1] ;
359 for (p = 0 ; p < len ; p++)
366 MULT_SUB (X [2*i + 1], uik, x [1]) ;
374 for (k = n-1 ; k >= 0 ; k--)
379 DIV (x [0], X [3*k], ukk) ;
380 DIV (x [1], X [3*k + 1], ukk) ;
381 DIV (x [2], X [3*k + 2], ukk) ;
384 X [3*k + 1] = x [1] ;
385 X [3*k + 2] = x [2] ;
386 for (p = 0 ; p < len ; p++)
391 MULT_SUB (X [3*i + 1], uik, x [1]) ;
392 MULT_SUB (X [3*i + 2], uik, x [2]) ;
400 for (k = n-1 ; k >= 0 ; k--)
405 DIV (x [0], X [4*k], ukk) ;
406 DIV (x [1], X [4*k + 1], ukk) ;
407 DIV (x [2], X [4*k + 2], ukk) ;
408 DIV (x [3], X [4*k + 3], ukk) ;
411 X [4*k + 1] = x [1] ;
412 X [4*k + 2] = x [2] ;
413 X [4*k + 3] = x [3] ;
414 for (p = 0 ; p < len ; p++)
420 MULT_SUB (X [4*i + 1], uik, x [1]) ;
421 MULT_SUB (X [4*i + 2], uik, x [2]) ;
422 MULT_SUB (X [4*i + 3], uik, x [3]) ;
466 for (k = n-1 ; k >= 0 ; k--)
470 for (p = 0 ; p < len ; p++)
482 MULT_SUB (x [0], Lx [p], X [Li [p]]) ;
491 for (k = n-1 ; k >= 0 ; k--)
494 x [1] = X [2*k + 1] ;
496 for (p = 0 ; p < len ; p++)
510 MULT_SUB (x [1], lik, X [2*i + 1]) ;
513 X [2*k + 1] = x [1] ;
519 for (k = n-1 ; k >= 0 ; k--)
522 x [1] = X [3*k + 1] ;
523 x [2] = X [3*k + 2] ;
525 for (p = 0 ; p < len ; p++)
539 MULT_SUB (x [1], lik, X [3*i + 1]) ;
540 MULT_SUB (x [2], lik, X [3*i + 2]) ;
543 X [3*k + 1] = x [1] ;
544 X [3*k + 2] = x [2] ;
550 for (k = n-1 ; k >= 0 ; k--)
553 x [1] = X [4*k + 1] ;
554 x [2] = X [4*k + 2] ;
555 x [3] = X [4*k + 3] ;
557 for (p = 0 ; p < len ; p++)
571 MULT_SUB (x [1], lik, X [4*i + 1]) ;
572 MULT_SUB (x [2], lik, X [4*i + 2]) ;
573 MULT_SUB (x [3], lik, X [4*i + 3]) ;
576 X [4*k + 1] = x [1] ;
577 X [4*k + 2] = x [2] ;
578 X [4*k + 3] = x [3] ;
610 Entry x [4], uik, ukk ;
620 for (k = 0 ; k < n ; k++)
624 for (p = 0 ; p < len ; p++)
636 MULT_SUB (x [0], Ux [p], X [Ui [p]]) ;
642 CONJ (ukk, Udiag [k]) ;
649 DIV (X [k], x [0], ukk) ;
655 for (k = 0 ; k < n ; k++)
659 x [1] = X [2*k + 1] ;
660 for (p = 0 ; p < len ; p++)
674 MULT_SUB (x [1], uik, X [2*i + 1]) ;
679 CONJ (ukk, Udiag [k]) ;
686 DIV (X [2*k], x [0], ukk) ;
687 DIV (X [2*k + 1], x [1], ukk) ;
693 for (k = 0 ; k < n ; k++)
697 x [1] = X [3*k + 1] ;
698 x [2] = X [3*k + 2] ;
699 for (p = 0 ; p < len ; p++)
713 MULT_SUB (x [1], uik, X [3*i + 1]) ;
714 MULT_SUB (x [2], uik, X [3*i + 2]) ;
719 CONJ (ukk, Udiag [k]) ;
726 DIV (X [3*k], x [0], ukk) ;
727 DIV (X [3*k + 1], x [1], ukk) ;
728 DIV (X [3*k + 2], x [2], ukk) ;
734 for (k = 0 ; k < n ; k++)
738 x [1] = X [4*k + 1] ;
739 x [2] = X [4*k + 2] ;
740 x [3] = X [4*k + 3] ;
741 for (p = 0 ; p < len ; p++)
755 MULT_SUB (x [1], uik, X [4*i + 1]) ;
756 MULT_SUB (x [2], uik, X [4*i + 2]) ;
757 MULT_SUB (x [3], uik, X [4*i + 3]) ;
762 CONJ (ukk, Udiag [k]) ;
769 DIV (X [4*k], x [0], ukk) ;
770 DIV (X [4*k + 1], x [1], ukk) ;
771 DIV (X [4*k + 2], x [2], ukk) ;
772 DIV (X [4*k + 3], x [3], ukk) ;
#define GET_POINTER(LU, Xip, Xlen, Xi, Xx, k, xlen)
void KLU_utsolve(Int n, Int Uip[], Int Ulen[], Unit LU[], Entry Udiag[], Int nrhs, Entry X[])
#define KLU_OUT_OF_MEMORY
#define ASSERT(expression)
#define MULT_SUB(c, a, b)
#define MULT_SUB_CONJ(c, a, b)
size_t KLU_kernel_factor(Int n, Int Ap[], Int Ai[], Entry Ax[], Int Q[], double Lsize, Unit **p_LU, Entry Udiag[], Int Llen[], Int Ulen[], Int Lip[], Int Uip[], Int P[], Int *lnz, Int *unz, Entry *X, Int *Work, Int k1, Int PSinv[], double Rs[], Int Offp[], Int Offi[], Entry Offx[], KLU_common *Common)
void KLU_lsolve(Int n, Int Lip[], Int Llen[], Unit LU[], Int nrhs, Entry X[])
void KLU_usolve(Int n, Int Uip[], Int Ulen[], Unit LU[], Entry Udiag[], Int nrhs, Entry X[])
void KLU_ltsolve(Int n, Int Lip[], Int Llen[], Unit LU[], Int nrhs, Entry X[])