38 #define FORM_NAME(prefix,rank) prefix ## amesos_ll_lsolve_ ## rank
42 #define FORM_NAME(prefix,rank) prefix ## amesos_ldl_ldsolve_ ## rank
46 #define FORM_NAME(prefix,rank) prefix ## amesos_ldl_lsolve_ ## rank
52 #define LSOLVE(prefix,rank) FORM_NAME(prefix,rank)
62 static void LSOLVE (PREFIX,1)
74 for (j = 0 ; j < n ; )
82 if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
96 for (p++ ; p < pend ; p++)
98 X [Li [p]] -= Lx [p] * y ;
103 else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
113 y [0] = X [j] / Lx [p] ;
114 y [1] = (X [j+1] - Lx [p+1] * y [0]) / Lx [q] ;
119 y [1] = X [j+1] - Lx [p+1] * y [0] ;
120 X [j ] = y [0] / Lx [p] ;
121 X [j+1] = y [1] / Lx [q] ;
124 y [1] = X [j+1] - Lx [p+1] * y [0] ;
127 for (p += 2, q++ ; p < pend ; p++, q++)
129 X [Li [p]] -= Lx [p] * y [0] + Lx [q] * y [1] ;
145 y [0] = X [j] / Lx [p] ;
146 y [1] = (X [j+1] - Lx [p+1] * y [0]) / Lx [q] ;
147 y [2] = (X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1]) / Lx [r] ;
153 y [1] = X [j+1] - Lx [p+1] * y [0] ;
154 y [2] = X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1] ;
155 X [j ] = y [0] / Lx [p] ;
156 X [j+1] = y [1] / Lx [q] ;
157 X [j+2] = y [2] / Lx [r] ;
160 y [1] = X [j+1] - Lx [p+1] * y [0] ;
161 y [2] = X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1] ;
165 for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
167 X [Li [p]] -= Lx [p] * y [0] + Lx [q] * y [1] + Lx [r] * y [2] ;
181 static void LSOLVE (PREFIX,2)
193 for (j = 0 ; j < n ; )
201 if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
217 X [j][0] = y [0] / Lx [p] ;
218 X [j][1] = y [1] / Lx [p] ;
220 for (p++ ; p < pend ; p++)
223 X [i][0] -= Lx [p] * y [0] ;
224 X [i][1] -= Lx [p] * y [1] ;
229 else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
238 y [0][0] = X [j][0] ;
239 y [0][1] = X [j][1] ;
243 y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
244 y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
245 X [j ][0] = y [0][0] ;
246 X [j ][1] = y [0][1] ;
247 X [j+1][0] = y [1][0] ;
248 X [j+1][1] = y [1][1] ;
250 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
251 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
252 X [j ][0] = y [0][0] / Lx [p] ;
253 X [j ][1] = y [0][1] / Lx [p] ;
254 X [j+1][0] = y [1][0] / Lx [q] ;
255 X [j+1][1] = y [1][1] / Lx [q] ;
257 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
258 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
259 X [j+1][0] = y [1][0] ;
260 X [j+1][1] = y [1][1] ;
262 for (p += 2, q++ ; p < pend ; p++, q++)
265 X [i][0] -= Lx [p] * y [0][0] + Lx [q] * y [1][0] ;
266 X [i][1] -= Lx [p] * y [0][1] + Lx [q] * y [1][1] ;
281 y [0][0] = X [j][0] ;
282 y [0][1] = X [j][1] ;
286 y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
287 y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
288 y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
289 y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
290 X [j ][0] = y [0][0] ;
291 X [j ][1] = y [0][1] ;
292 X [j+1][0] = y [1][0] ;
293 X [j+1][1] = y [1][1] ;
294 X [j+2][0] = y [2][0] ;
295 X [j+2][1] = y [2][1] ;
297 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
298 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
299 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
300 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
301 X [j ][0] = y [0][0] / Lx [p] ;
302 X [j ][1] = y [0][1] / Lx [p] ;
303 X [j+1][0] = y [1][0] / Lx [q] ;
304 X [j+1][1] = y [1][1] / Lx [q] ;
305 X [j+2][0] = y [2][0] / Lx [r] ;
306 X [j+2][1] = y [2][1] / Lx [r] ;
308 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
309 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
310 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
311 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
312 X [j+1][0] = y [1][0] ;
313 X [j+1][1] = y [1][1] ;
314 X [j+2][0] = y [2][0] ;
315 X [j+2][1] = y [2][1] ;
317 for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
320 X[i][0] -= Lx[p] * y[0][0] + Lx[q] * y[1][0] + Lx[r] * y[2][0] ;
321 X[i][1] -= Lx[p] * y[0][1] + Lx[q] * y[1][1] + Lx[r] * y[2][1] ;
335 static void LSOLVE (PREFIX,3)
347 for (j = 0 ; j < n ; )
355 if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
374 X [j][0] = y [0] / Lx [p] ;
375 X [j][1] = y [1] / Lx [p] ;
376 X [j][2] = y [2] / Lx [p] ;
378 for (p++ ; p < pend ; p++)
382 X [i][0] -= lx * y [0] ;
383 X [i][1] -= lx * y [1] ;
384 X [i][2] -= lx * y [2] ;
389 else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
398 y [0][0] = X [j][0] ;
399 y [0][1] = X [j][1] ;
400 y [0][2] = X [j][2] ;
405 y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
406 y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
407 y [1][2] = (X [j+1][2] - Lx [p+1] * y [0][2]) / Lx [q] ;
408 X [j ][0] = y [0][0] ;
409 X [j ][1] = y [0][1] ;
410 X [j ][2] = y [0][2] ;
411 X [j+1][0] = y [1][0] ;
412 X [j+1][1] = y [1][1] ;
413 X [j+1][2] = y [1][2] ;
415 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
416 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
417 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
418 X [j ][0] = y [0][0] / Lx [p] ;
419 X [j ][1] = y [0][1] / Lx [p] ;
420 X [j ][2] = y [0][2] / Lx [p] ;
421 X [j+1][0] = y [1][0] / Lx [q] ;
422 X [j+1][1] = y [1][1] / Lx [q] ;
423 X [j+1][2] = y [1][2] / Lx [q] ;
425 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
426 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
427 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
428 X [j+1][0] = y [1][0] ;
429 X [j+1][1] = y [1][1] ;
430 X [j+1][2] = y [1][2] ;
432 for (p += 2, q++ ; p < pend ; p++, q++)
438 X [i][0] -= lx [0] * y [0][0] + lx [1] * y [1][0] ;
439 X [i][1] -= lx [0] * y [0][1] + lx [1] * y [1][1] ;
440 X [i][2] -= lx [0] * y [0][2] + lx [1] * y [1][2] ;
455 y [0][0] = X [j][0] ;
456 y [0][1] = X [j][1] ;
457 y [0][2] = X [j][2] ;
462 y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
463 y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
464 y [1][2] = (X [j+1][2] - Lx[p+1] * y[0][2]) / Lx [q] ;
465 y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
466 y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
467 y [2][2] = (X [j+2][2] - Lx[p+2] * y[0][2] - Lx[q+1]*y[1][2])/Lx[r];
468 X [j ][0] = y [0][0] ;
469 X [j ][1] = y [0][1] ;
470 X [j ][2] = y [0][2] ;
471 X [j+1][0] = y [1][0] ;
472 X [j+1][1] = y [1][1] ;
473 X [j+1][2] = y [1][2] ;
474 X [j+2][0] = y [2][0] ;
475 X [j+2][1] = y [2][1] ;
476 X [j+2][2] = y [2][2] ;
478 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
479 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
480 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
481 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
482 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
483 y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
484 X [j ][0] = y [0][0] / Lx [p] ;
485 X [j ][1] = y [0][1] / Lx [p] ;
486 X [j ][2] = y [0][2] / Lx [p] ;
487 X [j+1][0] = y [1][0] / Lx [q] ;
488 X [j+1][1] = y [1][1] / Lx [q] ;
489 X [j+1][2] = y [1][2] / Lx [q] ;
490 X [j+2][0] = y [2][0] / Lx [r] ;
491 X [j+2][1] = y [2][1] / Lx [r] ;
492 X [j+2][2] = y [2][2] / Lx [r] ;
494 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
495 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
496 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
497 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
498 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
499 y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
500 X [j+1][0] = y [1][0] ;
501 X [j+1][1] = y [1][1] ;
502 X [j+1][2] = y [1][2] ;
503 X [j+2][0] = y [2][0] ;
504 X [j+2][1] = y [2][1] ;
505 X [j+2][2] = y [2][2] ;
507 for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
514 X [i][0] -= lx[0] * y[0][0] + lx[1] * y[1][0] + lx[2] * y[2][0];
515 X [i][1] -= lx[0] * y[0][1] + lx[1] * y[1][1] + lx[2] * y[2][1];
516 X [i][2] -= lx[0] * y[0][2] + lx[1] * y[1][2] + lx[2] * y[2][2];
530 static void LSOLVE (PREFIX,4)
542 for (j = 0 ; j < n ; )
550 if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
572 X [j][0] = y [0] / Lx [p] ;
573 X [j][1] = y [1] / Lx [p] ;
574 X [j][2] = y [2] / Lx [p] ;
575 X [j][3] = y [3] / Lx [p] ;
577 for (p++ ; p < pend ; p++)
581 X [i][0] -= lx * y [0] ;
582 X [i][1] -= lx * y [1] ;
583 X [i][2] -= lx * y [2] ;
584 X [i][3] -= lx * y [3] ;
589 else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
598 y [0][0] = X [j][0] ;
599 y [0][1] = X [j][1] ;
600 y [0][2] = X [j][2] ;
601 y [0][3] = X [j][3] ;
607 y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
608 y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
609 y [1][2] = (X [j+1][2] - Lx [p+1] * y [0][2]) / Lx [q] ;
610 y [1][3] = (X [j+1][3] - Lx [p+1] * y [0][3]) / Lx [q] ;
611 X [j ][0] = y [0][0] ;
612 X [j ][1] = y [0][1] ;
613 X [j ][2] = y [0][2] ;
614 X [j ][3] = y [0][3] ;
615 X [j+1][0] = y [1][0] ;
616 X [j+1][1] = y [1][1] ;
617 X [j+1][2] = y [1][2] ;
618 X [j+1][3] = y [1][3] ;
620 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
621 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
622 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
623 y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
624 X [j ][0] = y [0][0] / Lx [p] ;
625 X [j ][1] = y [0][1] / Lx [p] ;
626 X [j ][2] = y [0][2] / Lx [p] ;
627 X [j ][3] = y [0][3] / Lx [p] ;
628 X [j+1][0] = y [1][0] / Lx [q] ;
629 X [j+1][1] = y [1][1] / Lx [q] ;
630 X [j+1][2] = y [1][2] / Lx [q] ;
631 X [j+1][3] = y [1][3] / Lx [q] ;
633 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
634 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
635 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
636 y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
637 X [j+1][0] = y [1][0] ;
638 X [j+1][1] = y [1][1] ;
639 X [j+1][2] = y [1][2] ;
640 X [j+1][3] = y [1][3] ;
642 for (p += 2, q++ ; p < pend ; p++, q++)
648 X [i][0] -= lx [0] * y [0][0] + lx [1] * y [1][0] ;
649 X [i][1] -= lx [0] * y [0][1] + lx [1] * y [1][1] ;
650 X [i][2] -= lx [0] * y [0][2] + lx [1] * y [1][2] ;
651 X [i][3] -= lx [0] * y [0][3] + lx [1] * y [1][3] ;
666 y [0][0] = X [j][0] ;
667 y [0][1] = X [j][1] ;
668 y [0][2] = X [j][2] ;
669 y [0][3] = X [j][3] ;
675 y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
676 y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
677 y [1][2] = (X [j+1][2] - Lx[p+1] * y[0][2]) / Lx [q] ;
678 y [1][3] = (X [j+1][3] - Lx[p+1] * y[0][3]) / Lx [q] ;
679 y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
680 y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
681 y [2][2] = (X [j+2][2] - Lx[p+2] * y[0][2] - Lx[q+1]*y[1][2])/Lx[r];
682 y [2][3] = (X [j+2][3] - Lx[p+2] * y[0][3] - Lx[q+1]*y[1][3])/Lx[r];
683 X [j ][0] = y [0][0] ;
684 X [j ][1] = y [0][1] ;
685 X [j ][2] = y [0][2] ;
686 X [j ][3] = y [0][3] ;
687 X [j+1][0] = y [1][0] ;
688 X [j+1][1] = y [1][1] ;
689 X [j+1][2] = y [1][2] ;
690 X [j+1][3] = y [1][3] ;
691 X [j+2][0] = y [2][0] ;
692 X [j+2][1] = y [2][1] ;
693 X [j+2][2] = y [2][2] ;
694 X [j+2][3] = y [2][3] ;
696 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
697 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
698 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
699 y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
700 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
701 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
702 y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
703 y [2][3] = X [j+2][3] - Lx [p+2] * y [0][3] - Lx [q+1] * y [1][3] ;
704 X [j ][0] = y [0][0] / Lx [p] ;
705 X [j ][1] = y [0][1] / Lx [p] ;
706 X [j ][2] = y [0][2] / Lx [p] ;
707 X [j ][3] = y [0][3] / Lx [p] ;
708 X [j+1][0] = y [1][0] / Lx [q] ;
709 X [j+1][1] = y [1][1] / Lx [q] ;
710 X [j+1][2] = y [1][2] / Lx [q] ;
711 X [j+1][3] = y [1][3] / Lx [q] ;
712 X [j+2][0] = y [2][0] / Lx [r] ;
713 X [j+2][1] = y [2][1] / Lx [r] ;
714 X [j+2][2] = y [2][2] / Lx [r] ;
715 X [j+2][3] = y [2][3] / Lx [r] ;
717 y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
718 y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
719 y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
720 y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
721 y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
722 y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
723 y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
724 y [2][3] = X [j+2][3] - Lx [p+2] * y [0][3] - Lx [q+1] * y [1][3] ;
725 X [j+1][0] = y [1][0] ;
726 X [j+1][1] = y [1][1] ;
727 X [j+1][2] = y [1][2] ;
728 X [j+1][3] = y [1][3] ;
729 X [j+2][0] = y [2][0] ;
730 X [j+2][1] = y [2][1] ;
731 X [j+2][2] = y [2][2] ;
732 X [j+2][3] = y [2][3] ;
734 for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
741 X [i][0] -= lx[0] * y[0][0] + lx[1] * y[1][0] + lx[2] * y[2][0];
742 X [i][1] -= lx[0] * y[0][1] + lx[1] * y[1][1] + lx[2] * y[2][1];
743 X [i][2] -= lx[0] * y[0][2] + lx[1] * y[1][2] + lx[2] * y[2][2];
744 X [i][3] -= lx[0] * y[0][3] + lx[1] * y[1][3] + lx[2] * y[2][3];
780 ASSERT (L->xtype == Y->xtype) ;
781 ASSERT (L->n == Y->ncol) ;
782 ASSERT (Y->nrow == Y->d) ;
810 for (j = 0 ; j < n ; j++)
818 ASSIGN (yx,yz,0, Xx,Xz,j) ;
823 DIV_REAL (yx,yz,0, yx,yz,0, Lx,p) ;
824 ASSIGN (Xx,Xz,j, yx,yz,0) ;
827 DIV_REAL (Xx,Xz,j, yx,yz,0, Lx,p) ;
830 for (p++ ; p < pend ; p++)
834 MULTSUB (Xx,Xz,i, Lx,Lz,p, yx,yz,0) ;
#define ASSERT(expression)
#define LSOLVE(prefix, rank)
#define ASSIGN(c, s1, s2, p, split)