32 Entry x [4], offik, s ;
34 Entry *Offx, *X, *Bz, *Udiag ;
35 Int *Q, *R, *Pnum, *Offp, *Offi, *Lip, *Uip, *Llen, *Ulen ;
37 Int k1, k2, nk, k, block, pend,
n, p, nblocks, chunk, nr, i ;
47 if (Numeric ==
NULL || Symbolic ==
NULL || d < Symbolic->n || nrhs < 0 ||
61 nblocks = Symbolic->nblocks ;
69 ASSERT (nblocks == Numeric->nblocks) ;
70 Pnum = Numeric->Pnum ;
71 Offp = Numeric->Offp ;
72 Offi = Numeric->Offi ;
73 Offx = (
Entry *) Numeric->Offx ;
76 Llen = Numeric->Llen ;
78 Ulen = Numeric->Ulen ;
79 LUbx = (
Unit **) Numeric->LUbx ;
80 Udiag = Numeric->Udiag ;
83 X = (
Entry *) Numeric->Xwork ;
91 for (chunk = 0 ; chunk < nrhs ; chunk += 4)
98 nr =
MIN (nrhs - chunk, 4) ;
113 for (k = 0 ; k < n ; k++)
115 X [k] = Bz [Pnum [k]] ;
121 for (k = 0 ; k < n ; k++)
125 X [2*k + 1] = Bz [i + d ] ;
131 for (k = 0 ; k < n ; k++)
135 X [3*k + 1] = Bz [i + d ] ;
136 X [3*k + 2] = Bz [i + d*2] ;
142 for (k = 0 ; k < n ; k++)
146 X [4*k + 1] = Bz [i + d ] ;
147 X [4*k + 2] = Bz [i + d*2] ;
148 X [4*k + 3] = Bz [i + d*3] ;
162 for (k = 0 ; k < n ; k++)
170 for (k = 0 ; k < n ; k++)
181 for (k = 0 ; k < n ; k++)
193 for (k = 0 ; k < n ; k++)
210 for (block = nblocks-1 ; block >= 0 ; block--)
220 PRINTF ((
"solve %d, k1 %d k2-1 %d nk %d\n", block, k1,k2-1,nk)) ;
230 DIV (X [k1], X [k1], s) ;
234 DIV (X [2*k1], X [2*k1], s) ;
235 DIV (X [2*k1 + 1], X [2*k1 + 1], s) ;
239 DIV (X [3*k1], X [3*k1], s) ;
240 DIV (X [3*k1 + 1], X [3*k1 + 1], s) ;
241 DIV (X [3*k1 + 2], X [3*k1 + 2], s) ;
245 DIV (X [4*k1], X [4*k1], s) ;
246 DIV (X [4*k1 + 1], X [4*k1 + 1], s) ;
247 DIV (X [4*k1 + 2], X [4*k1 + 2], s) ;
248 DIV (X [4*k1 + 3], X [4*k1 + 3], s) ;
255 KLU_lsolve (nk, Lip + k1, Llen + k1, LUbx [block], nr,
257 KLU_usolve (nk, Uip + k1, Ulen + k1, LUbx [block],
258 Udiag + k1, nr, X + nr*k1) ;
272 for (k = k1 ; k < k2 ; k++)
276 for (p = Offp [k] ; p < pend ; p++)
278 MULT_SUB (X [Offi [p]], Offx [p], x [0]) ;
285 for (k = k1 ; k < k2 ; k++)
289 x [1] = X [2*k + 1] ;
290 for (p = Offp [k] ; p < pend ; p++)
295 MULT_SUB (X [2*i + 1], offik, x [1]) ;
302 for (k = k1 ; k < k2 ; k++)
306 x [1] = X [3*k + 1] ;
307 x [2] = X [3*k + 2] ;
308 for (p = Offp [k] ; p < pend ; p++)
313 MULT_SUB (X [3*i + 1], offik, x [1]) ;
314 MULT_SUB (X [3*i + 2], offik, x [2]) ;
321 for (k = k1 ; k < k2 ; k++)
325 x [1] = X [4*k + 1] ;
326 x [2] = X [4*k + 2] ;
327 x [3] = X [4*k + 3] ;
328 for (p = Offp [k] ; p < pend ; p++)
333 MULT_SUB (X [4*i + 1], offik, x [1]) ;
334 MULT_SUB (X [4*i + 2], offik, x [2]) ;
335 MULT_SUB (X [4*i + 3], offik, x [3]) ;
352 for (k = 0 ; k < n ; k++)
360 for (k = 0 ; k < n ; k++)
364 Bz [i + d ] = X [2*k + 1] ;
370 for (k = 0 ; k < n ; k++)
374 Bz [i + d ] = X [3*k + 1] ;
375 Bz [i + d*2] = X [3*k + 2] ;
381 for (k = 0 ; k < n ; k++)
385 Bz [i + d ] = X [4*k + 1] ;
386 Bz [i + d*2] = X [4*k + 2] ;
387 Bz [i + d*3] = X [4*k + 3] ;
Int KLU_solve(KLU_symbolic *Symbolic, KLU_numeric *Numeric, Int d, Int nrhs, double B[], KLU_common *Common)
#define ASSERT(expression)
#define MULT_SUB(c, a, b)
#define SCALE_DIV_ASSIGN(a, c, s)