39 #define FORM_NAME(prefix,rank) prefix ## amesos_ll_ltsolve_ ## rank
44 #define FORM_NAME(prefix,rank) prefix ## amesos_ldl_dltsolve_ ## rank
49 #define FORM_NAME(prefix,rank) prefix ## amesos_ldl_ltsolve_ ## rank
54 #define LSOLVE(prefix,rank) FORM_NAME(prefix,rank)
64 static void LSOLVE (PREFIX,1)
76 for (j = n-1 ; j >= 0 ; )
84 if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
98 for (p++ ; p < pend ; p++)
100 y -= Lx [p] * X [Li [p]] ;
110 else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
126 y [0] = X [j ] / d [0] ;
127 y [1] = X [j-1] / d [1] ;
132 for (p++, q += 2 ; p < pend ; p++, q++)
135 y [0] -= Lx [p] * X [i] ;
136 y [1] -= Lx [q] * X [i] ;
140 y [1] = (y [1] - t * y [0]) / d [1] ;
156 double y [3], t [3] ;
169 y [0] = X [j] / d [0] ;
170 y [1] = X [j-1] / d [1] ;
171 y [2] = X [j-2] / d [2] ;
177 for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
180 y [0] -= Lx [p] * X [i] ;
181 y [1] -= Lx [q] * X [i] ;
182 y [2] -= Lx [r] * X [i] ;
186 y [1] = (y [1] - t [0] * y [0]) / d [1] ;
187 y [2] = (y [2] - t [2] * y [0] - t [1] * y [1]) / d [2] ;
189 y [1] -= t [0] * y [0] ;
190 y [2] -= t [2] * y [0] + t [1] * y [1] ;
207 static void LSOLVE (PREFIX,2)
219 for (j = n-1 ; j >= 0 ; )
227 if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
239 y [0] = X [j][0] / d ;
240 y [1] = X [j][1] / d ;
245 for (p++ ; p < pend ; p++)
248 y [0] -= Lx [p] * X [i][0] ;
249 y [1] -= Lx [p] * X [i][1] ;
252 X [j][0] = y [0] / d ;
253 X [j][1] = y [1] / d ;
261 else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
277 y [0][0] = X [j ][0] / d [0] ;
278 y [0][1] = X [j ][1] / d [0] ;
279 y [1][0] = X [j-1][0] / d [1] ;
280 y [1][1] = X [j-1][1] / d [1] ;
282 y [0][0] = X [j ][0] ;
283 y [0][1] = X [j ][1] ;
284 y [1][0] = X [j-1][0] ;
285 y [1][1] = X [j-1][1] ;
287 for (p++, q += 2 ; p < pend ; p++, q++)
290 y [0][0] -= Lx [p] * X [i][0] ;
291 y [0][1] -= Lx [p] * X [i][1] ;
292 y [1][0] -= Lx [q] * X [i][0] ;
293 y [1][1] -= Lx [q] * X [i][1] ;
298 y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
299 y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
301 y [1][0] -= t * y [0][0] ;
302 y [1][1] -= t * y [0][1] ;
304 X [j ][0] = y [0][0] ;
305 X [j ][1] = y [0][1] ;
306 X [j-1][0] = y [1][0] ;
307 X [j-1][1] = y [1][1] ;
318 double y [3][2], t [3] ;
331 y [0][0] = X [j ][0] / d [0] ;
332 y [0][1] = X [j ][1] / d [0] ;
333 y [1][0] = X [j-1][0] / d [1] ;
334 y [1][1] = X [j-1][1] / d [1] ;
335 y [2][0] = X [j-2][0] / d [2] ;
336 y [2][1] = X [j-2][1] / d [2] ;
338 y [0][0] = X [j ][0] ;
339 y [0][1] = X [j ][1] ;
340 y [1][0] = X [j-1][0] ;
341 y [1][1] = X [j-1][1] ;
342 y [2][0] = X [j-2][0] ;
343 y [2][1] = X [j-2][1] ;
345 for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
348 y [0][0] -= Lx [p] * X [i][0] ;
349 y [0][1] -= Lx [p] * X [i][1] ;
350 y [1][0] -= Lx [q] * X [i][0] ;
351 y [1][1] -= Lx [q] * X [i][1] ;
352 y [2][0] -= Lx [r] * X [i][0] ;
353 y [2][1] -= Lx [r] * X [i][1] ;
358 y [1][0] = (y [1][0] - t [0] * y [0][0]) / d [1] ;
359 y [1][1] = (y [1][1] - t [0] * y [0][1]) / d [1] ;
360 y [2][0] = (y [2][0] - t [2] * y [0][0] - t [1] * y [1][0]) / d [2];
361 y [2][1] = (y [2][1] - t [2] * y [0][1] - t [1] * y [1][1]) / d [2];
363 y [1][0] -= t [0] * y [0][0] ;
364 y [1][1] -= t [0] * y [0][1] ;
365 y [2][0] -= t [2] * y [0][0] + t [1] * y [1][0] ;
366 y [2][1] -= t [2] * y [0][1] + t [1] * y [1][1] ;
368 X [j ][0] = y [0][0] ;
369 X [j ][1] = y [0][1] ;
370 X [j-1][0] = y [1][0] ;
371 X [j-1][1] = y [1][1] ;
372 X [j-2][0] = y [2][0] ;
373 X [j-2][1] = y [2][1] ;
386 static void LSOLVE (PREFIX,3)
398 for (j = n-1 ; j >= 0 ; )
406 if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
418 y [0] = X [j][0] / d ;
419 y [1] = X [j][1] / d ;
420 y [2] = X [j][2] / d ;
426 for (p++ ; p < pend ; p++)
429 y [0] -= Lx [p] * X [i][0] ;
430 y [1] -= Lx [p] * X [i][1] ;
431 y [2] -= Lx [p] * X [i][2] ;
434 X [j][0] = y [0] / d ;
435 X [j][1] = y [1] / d ;
436 X [j][2] = y [2] / d ;
445 else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
461 y [0][0] = X [j ][0] / d [0] ;
462 y [0][1] = X [j ][1] / d [0] ;
463 y [0][2] = X [j ][2] / d [0] ;
464 y [1][0] = X [j-1][0] / d [1] ;
465 y [1][1] = X [j-1][1] / d [1] ;
466 y [1][2] = X [j-1][2] / d [1] ;
468 y [0][0] = X [j ][0] ;
469 y [0][1] = X [j ][1] ;
470 y [0][2] = X [j ][2] ;
471 y [1][0] = X [j-1][0] ;
472 y [1][1] = X [j-1][1] ;
473 y [1][2] = X [j-1][2] ;
475 for (p++, q += 2 ; p < pend ; p++, q++)
478 y [0][0] -= Lx [p] * X [i][0] ;
479 y [0][1] -= Lx [p] * X [i][1] ;
480 y [0][2] -= Lx [p] * X [i][2] ;
481 y [1][0] -= Lx [q] * X [i][0] ;
482 y [1][1] -= Lx [q] * X [i][1] ;
483 y [1][2] -= Lx [q] * X [i][2] ;
489 y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
490 y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
491 y [1][2] = (y [1][2] - t * y [0][2]) / d [1] ;
493 y [1][0] -= t * y [0][0] ;
494 y [1][1] -= t * y [0][1] ;
495 y [1][2] -= t * y [0][2] ;
497 X [j ][0] = y [0][0] ;
498 X [j ][1] = y [0][1] ;
499 X [j ][2] = y [0][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] ;
513 double y [3][3], t [3] ;
526 y [0][0] = X [j ][0] / d [0] ;
527 y [0][1] = X [j ][1] / d [0] ;
528 y [0][2] = X [j ][2] / d [0] ;
529 y [1][0] = X [j-1][0] / d [1] ;
530 y [1][1] = X [j-1][1] / d [1] ;
531 y [1][2] = X [j-1][2] / d [1] ;
532 y [2][0] = X [j-2][0] / d [2] ;
533 y [2][1] = X [j-2][1] / d [2] ;
534 y [2][2] = X [j-2][2] / d [2] ;
536 y [0][0] = X [j ][0] ;
537 y [0][1] = X [j ][1] ;
538 y [0][2] = X [j ][2] ;
539 y [1][0] = X [j-1][0] ;
540 y [1][1] = X [j-1][1] ;
541 y [1][2] = X [j-1][2] ;
542 y [2][0] = X [j-2][0] ;
543 y [2][1] = X [j-2][1] ;
544 y [2][2] = X [j-2][2] ;
546 for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
549 y [0][0] -= Lx [p] * X [i][0] ;
550 y [0][1] -= Lx [p] * X [i][1] ;
551 y [0][2] -= Lx [p] * X [i][2] ;
552 y [1][0] -= Lx [q] * X [i][0] ;
553 y [1][1] -= Lx [q] * X [i][1] ;
554 y [1][2] -= Lx [q] * X [i][2] ;
555 y [2][0] -= Lx [r] * X [i][0] ;
556 y [2][1] -= Lx [r] * X [i][1] ;
557 y [2][2] -= Lx [r] * X [i][2] ;
563 y [1][0] = (y [1][0] - t [0] * y [0][0]) / d [1] ;
564 y [1][1] = (y [1][1] - t [0] * y [0][1]) / d [1] ;
565 y [1][2] = (y [1][2] - t [0] * y [0][2]) / d [1] ;
566 y [2][0] = (y [2][0] - t [2] * y [0][0] - t [1] * y [1][0]) / d [2];
567 y [2][1] = (y [2][1] - t [2] * y [0][1] - t [1] * y [1][1]) / d [2];
568 y [2][2] = (y [2][2] - t [2] * y [0][2] - t [1] * y [1][2]) / d [2];
570 y [1][0] -= t [0] * y [0][0] ;
571 y [1][1] -= t [0] * y [0][1] ;
572 y [1][2] -= t [0] * y [0][2] ;
573 y [2][0] -= t [2] * y [0][0] + t [1] * y [1][0] ;
574 y [2][1] -= t [2] * y [0][1] + t [1] * y [1][1] ;
575 y [2][2] -= t [2] * y [0][2] + t [1] * y [1][2] ;
577 X [j ][0] = y [0][0] ;
578 X [j ][1] = y [0][1] ;
579 X [j ][2] = y [0][2] ;
580 X [j-1][0] = y [1][0] ;
581 X [j-1][1] = y [1][1] ;
582 X [j-1][2] = y [1][2] ;
583 X [j-2][0] = y [2][0] ;
584 X [j-2][1] = y [2][1] ;
585 X [j-2][2] = y [2][2] ;
598 static void LSOLVE (PREFIX,4)
610 for (j = n-1 ; j >= 0 ; )
618 if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
630 y [0] = X [j][0] / d ;
631 y [1] = X [j][1] / d ;
632 y [2] = X [j][2] / d ;
633 y [3] = X [j][3] / d ;
640 for (p++ ; p < pend ; p++)
643 y [0] -= Lx [p] * X [i][0] ;
644 y [1] -= Lx [p] * X [i][1] ;
645 y [2] -= Lx [p] * X [i][2] ;
646 y [3] -= Lx [p] * X [i][3] ;
649 X [j][0] = y [0] / d ;
650 X [j][1] = y [1] / d ;
651 X [j][2] = y [2] / d ;
652 X [j][3] = y [3] / d ;
678 y [0][0] = X [j ][0] / d [0] ;
679 y [0][1] = X [j ][1] / d [0] ;
680 y [0][2] = X [j ][2] / d [0] ;
681 y [0][3] = X [j ][3] / d [0] ;
682 y [1][0] = X [j-1][0] / d [1] ;
683 y [1][1] = X [j-1][1] / d [1] ;
684 y [1][2] = X [j-1][2] / d [1] ;
685 y [1][3] = X [j-1][3] / d [1] ;
687 y [0][0] = X [j ][0] ;
688 y [0][1] = X [j ][1] ;
689 y [0][2] = X [j ][2] ;
690 y [0][3] = X [j ][3] ;
691 y [1][0] = X [j-1][0] ;
692 y [1][1] = X [j-1][1] ;
693 y [1][2] = X [j-1][2] ;
694 y [1][3] = X [j-1][3] ;
696 for (p++, q += 2 ; p < pend ; p++, q++)
699 y [0][0] -= Lx [p] * X [i][0] ;
700 y [0][1] -= Lx [p] * X [i][1] ;
701 y [0][2] -= Lx [p] * X [i][2] ;
702 y [0][3] -= Lx [p] * X [i][3] ;
703 y [1][0] -= Lx [q] * X [i][0] ;
704 y [1][1] -= Lx [q] * X [i][1] ;
705 y [1][2] -= Lx [q] * X [i][2] ;
706 y [1][3] -= Lx [q] * X [i][3] ;
713 y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
714 y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
715 y [1][2] = (y [1][2] - t * y [0][2]) / d [1] ;
716 y [1][3] = (y [1][3] - t * y [0][3]) / d [1] ;
718 y [1][0] -= t * y [0][0] ;
719 y [1][1] -= t * y [0][1] ;
720 y [1][2] -= t * y [0][2] ;
721 y [1][3] -= t * y [0][3] ;
723 X [j ][0] = y [0][0] ;
724 X [j ][1] = y [0][1] ;
725 X [j ][2] = y [0][2] ;
726 X [j ][3] = y [0][3] ;
727 X [j-1][0] = y [1][0] ;
728 X [j-1][1] = y [1][1] ;
729 X [j-1][2] = y [1][2] ;
730 X [j-1][3] = y [1][3] ;
771 ASSERT (L->xtype == Y->xtype) ;
772 ASSERT (L->n == Y->ncol) ;
773 ASSERT (Y->nrow == Y->d) ;
800 for (j = n-1 ; j >= 0 ; j--)
808 ASSIGN (yx,yz,0, Xx,Xz,j) ;
812 ASSIGN_REAL (d,0, Lx,p) ;
816 DIV_REAL (yx,yz,0, yx,yz,0, d,0) ;
819 for (p++ ; p < pend ; p++)
823 MULTSUBCONJ (yx,yz,0, Lx,Lz,p, Xx,Xz,i) ;
828 DIV_REAL (Xx,Xz,j, yx,yz,0, d,0) ;
831 ASSIGN (Xx,Xz,j, yx,yz,0) ;
#define LSOLVE(prefix, rank)
#define ASSERT(expression)
#define ASSIGN(c, s1, s2, p, split)