29 Entry x [4], offik, s ;
31 Entry *Offx, *X, *Bz, *Udiag ;
32 Int *Q, *R, *Pnum, *Offp, *Offi, *Lip, *Uip, *Llen, *Ulen ;
34 Int k1, k2, nk, k, block, pend,
n, p, nblocks, chunk, nr, i ;
44 if (Numeric ==
NULL || Symbolic ==
NULL || d < Symbolic->n || nrhs < 0 ||
58 nblocks = Symbolic->nblocks ;
66 ASSERT (nblocks == Numeric->nblocks) ;
67 Pnum = Numeric->Pnum ;
68 Offp = Numeric->Offp ;
69 Offi = Numeric->Offi ;
70 Offx = (
Entry *) Numeric->Offx ;
73 Llen = Numeric->Llen ;
75 Ulen = Numeric->Ulen ;
76 LUbx = (
Unit **) Numeric->LUbx ;
77 Udiag = Numeric->Udiag ;
80 X = (
Entry *) Numeric->Xwork ;
88 for (chunk = 0 ; chunk < nrhs ; chunk += 4)
95 nr =
MIN (nrhs - chunk, 4) ;
110 for (k = 0 ; k < n ; k++)
112 X [k] = Bz [Pnum [k]] ;
118 for (k = 0 ; k < n ; k++)
122 X [2*k + 1] = Bz [i + d ] ;
128 for (k = 0 ; k < n ; k++)
132 X [3*k + 1] = Bz [i + d ] ;
133 X [3*k + 2] = Bz [i + d*2] ;
139 for (k = 0 ; k < n ; k++)
143 X [4*k + 1] = Bz [i + d ] ;
144 X [4*k + 2] = Bz [i + d*2] ;
145 X [4*k + 3] = Bz [i + d*3] ;
159 for (k = 0 ; k < n ; k++)
167 for (k = 0 ; k < n ; k++)
178 for (k = 0 ; k < n ; k++)
190 for (k = 0 ; k < n ; k++)
207 for (block = nblocks-1 ; block >= 0 ; block--)
217 PRINTF ((
"solve %d, k1 %d k2-1 %d nk %d\n", block, k1,k2-1,nk)) ;
227 DIV (X [k1], X [k1], s) ;
231 DIV (X [2*k1], X [2*k1], s) ;
232 DIV (X [2*k1 + 1], X [2*k1 + 1], s) ;
236 DIV (X [3*k1], X [3*k1], s) ;
237 DIV (X [3*k1 + 1], X [3*k1 + 1], s) ;
238 DIV (X [3*k1 + 2], X [3*k1 + 2], s) ;
242 DIV (X [4*k1], X [4*k1], s) ;
243 DIV (X [4*k1 + 1], X [4*k1 + 1], s) ;
244 DIV (X [4*k1 + 2], X [4*k1 + 2], s) ;
245 DIV (X [4*k1 + 3], X [4*k1 + 3], s) ;
252 KLU_lsolve (nk, Lip + k1, Llen + k1, LUbx [block], nr,
254 KLU_usolve (nk, Uip + k1, Ulen + k1, LUbx [block],
255 Udiag + k1, nr, X + nr*k1) ;
269 for (k = k1 ; k < k2 ; k++)
273 for (p = Offp [k] ; p < pend ; p++)
275 MULT_SUB (X [Offi [p]], Offx [p], x [0]) ;
282 for (k = k1 ; k < k2 ; k++)
286 x [1] = X [2*k + 1] ;
287 for (p = Offp [k] ; p < pend ; p++)
292 MULT_SUB (X [2*i + 1], offik, x [1]) ;
299 for (k = k1 ; k < k2 ; k++)
303 x [1] = X [3*k + 1] ;
304 x [2] = X [3*k + 2] ;
305 for (p = Offp [k] ; p < pend ; p++)
310 MULT_SUB (X [3*i + 1], offik, x [1]) ;
311 MULT_SUB (X [3*i + 2], offik, x [2]) ;
318 for (k = k1 ; k < k2 ; k++)
322 x [1] = X [4*k + 1] ;
323 x [2] = X [4*k + 2] ;
324 x [3] = X [4*k + 3] ;
325 for (p = Offp [k] ; p < pend ; p++)
330 MULT_SUB (X [4*i + 1], offik, x [1]) ;
331 MULT_SUB (X [4*i + 2], offik, x [2]) ;
332 MULT_SUB (X [4*i + 3], offik, x [3]) ;
349 for (k = 0 ; k < n ; k++)
357 for (k = 0 ; k < n ; k++)
361 Bz [i + d ] = X [2*k + 1] ;
367 for (k = 0 ; k < n ; k++)
371 Bz [i + d ] = X [3*k + 1] ;
372 Bz [i + d*2] = X [3*k + 2] ;
378 for (k = 0 ; k < n ; k++)
382 Bz [i + d ] = X [4*k + 1] ;
383 Bz [i + d*2] = X [4*k + 2] ;
384 Bz [i + d*3] = X [4*k + 3] ;
#define ASSERT(expression)
#define MULT_SUB(c, a, b)
Int KLU_solve(KLU_symbolic *Symbolic, KLU_numeric *Numeric, Int d, Int nrhs, double B[], KLU_common *Common)
#define SCALE_DIV_ASSIGN(a, c, s)