277
278
279
280
281
282
283 CHARACTER TRANSR, DIAG, SIDE, TRANS, UPLO
284 INTEGER LDB, M, N
285 DOUBLE PRECISION ALPHA
286
287
288 DOUBLE PRECISION A( 0: * ), B( 0: LDB-1, 0: * )
289
290
291
292
293
294
295 DOUBLE PRECISION ONE, ZERO
296 parameter( one = 1.0d+0, zero = 0.0d+0 )
297
298
299 LOGICAL LOWER, LSIDE, MISODD, NISODD, NORMALTRANSR,
300 $ NOTRANS
301 INTEGER M1, M2, N1, N2, K, INFO, I, J
302
303
304 LOGICAL LSAME
306
307
309
310
311 INTRINSIC max, mod
312
313
314
315
316
317 info = 0
318 normaltransr =
lsame( transr,
'N' )
319 lside =
lsame( side,
'L' )
320 lower =
lsame( uplo,
'L' )
321 notrans =
lsame( trans,
'N' )
322 IF( .NOT.normaltransr .AND. .NOT.
lsame( transr,
'T' ) )
THEN
323 info = -1
324 ELSE IF( .NOT.lside .AND. .NOT.
lsame( side,
'R' ) )
THEN
325 info = -2
326 ELSE IF( .NOT.lower .AND. .NOT.
lsame( uplo,
'U' ) )
THEN
327 info = -3
328 ELSE IF( .NOT.notrans .AND. .NOT.
lsame( trans,
'T' ) )
THEN
329 info = -4
330 ELSE IF( .NOT.
lsame( diag,
'N' ) .AND.
331 $ .NOT.
lsame( diag,
'U' ) )
332 $ THEN
333 info = -5
334 ELSE IF( m.LT.0 ) THEN
335 info = -6
336 ELSE IF( n.LT.0 ) THEN
337 info = -7
338 ELSE IF( ldb.LT.max( 1, m ) ) THEN
339 info = -11
340 END IF
341 IF( info.NE.0 ) THEN
342 CALL xerbla(
'DTFSM ', -info )
343 RETURN
344 END IF
345
346
347
348 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
349 $ RETURN
350
351
352
353 IF( alpha.EQ.zero ) THEN
354 DO 20 j = 0, n - 1
355 DO 10 i = 0, m - 1
356 b( i, j ) = zero
357 10 CONTINUE
358 20 CONTINUE
359 RETURN
360 END IF
361
362 IF( lside ) THEN
363
364
365
366
367
368
369
370 IF( mod( m, 2 ).EQ.0 ) THEN
371 misodd = .false.
372 k = m / 2
373 ELSE
374 misodd = .true.
375 IF( lower ) THEN
376 m2 = m / 2
377 m1 = m - m2
378 ELSE
379 m1 = m / 2
380 m2 = m - m1
381 END IF
382 END IF
383
384
385 IF( misodd ) THEN
386
387
388
389 IF( normaltransr ) THEN
390
391
392
393 IF( lower ) THEN
394
395
396
397 IF( notrans ) THEN
398
399
400
401
402 IF( m.EQ.1 ) THEN
403 CALL dtrsm(
'L',
'L',
'N', diag, m1, n,
404 $ alpha,
405 $ a, m, b, ldb )
406 ELSE
407 CALL dtrsm(
'L',
'L',
'N', diag, m1, n,
408 $ alpha,
409 $ a( 0 ), m, b, ldb )
410 CALL dgemm(
'N',
'N', m2, n, m1, -one,
411 $ a( m1 ),
412 $ m, b, ldb, alpha, b( m1, 0 ), ldb )
413 CALL dtrsm(
'L',
'U',
'T', diag, m2, n, one,
414 $ a( m ), m, b( m1, 0 ), ldb )
415 END IF
416
417 ELSE
418
419
420
421
422 IF( m.EQ.1 ) THEN
423 CALL dtrsm(
'L',
'L',
'T', diag, m1, n,
424 $ alpha,
425 $ a( 0 ), m, b, ldb )
426 ELSE
427 CALL dtrsm(
'L',
'U',
'N', diag, m2, n,
428 $ alpha,
429 $ a( m ), m, b( m1, 0 ), ldb )
430 CALL dgemm(
'T',
'N', m1, n, m2, -one,
431 $ a( m1 ),
432 $ m, b( m1, 0 ), ldb, alpha, b, ldb )
433 CALL dtrsm(
'L',
'L',
'T', diag, m1, n, one,
434 $ a( 0 ), m, b, ldb )
435 END IF
436
437 END IF
438
439 ELSE
440
441
442
443 IF( .NOT.notrans ) THEN
444
445
446
447
448 CALL dtrsm(
'L',
'L',
'N', diag, m1, n, alpha,
449 $ a( m2 ), m, b, ldb )
450 CALL dgemm(
'T',
'N', m2, n, m1, -one, a( 0 ),
451 $ m,
452 $ b, ldb, alpha, b( m1, 0 ), ldb )
453 CALL dtrsm(
'L',
'U',
'T', diag, m2, n, one,
454 $ a( m1 ), m, b( m1, 0 ), ldb )
455
456 ELSE
457
458
459
460
461 CALL dtrsm(
'L',
'U',
'N', diag, m2, n, alpha,
462 $ a( m1 ), m, b( m1, 0 ), ldb )
463 CALL dgemm(
'N',
'N', m1, n, m2, -one, a( 0 ),
464 $ m,
465 $ b( m1, 0 ), ldb, alpha, b, ldb )
466 CALL dtrsm(
'L',
'L',
'T', diag, m1, n, one,
467 $ a( m2 ), m, b, ldb )
468
469 END IF
470
471 END IF
472
473 ELSE
474
475
476
477 IF( lower ) THEN
478
479
480
481 IF( notrans ) THEN
482
483
484
485
486 IF( m.EQ.1 ) THEN
487 CALL dtrsm(
'L',
'U',
'T', diag, m1, n,
488 $ alpha,
489 $ a( 0 ), m1, b, ldb )
490 ELSE
491 CALL dtrsm(
'L',
'U',
'T', diag, m1, n,
492 $ alpha,
493 $ a( 0 ), m1, b, ldb )
494 CALL dgemm(
'T',
'N', m2, n, m1, -one,
495 $ a( m1*m1 ), m1, b, ldb, alpha,
496 $ b( m1, 0 ), ldb )
497 CALL dtrsm(
'L',
'L',
'N', diag, m2, n, one,
498 $ a( 1 ), m1, b( m1, 0 ), ldb )
499 END IF
500
501 ELSE
502
503
504
505
506 IF( m.EQ.1 ) THEN
507 CALL dtrsm(
'L',
'U',
'N', diag, m1, n,
508 $ alpha,
509 $ a( 0 ), m1, b, ldb )
510 ELSE
511 CALL dtrsm(
'L',
'L',
'T', diag, m2, n,
512 $ alpha,
513 $ a( 1 ), m1, b( m1, 0 ), ldb )
514 CALL dgemm(
'N',
'N', m1, n, m2, -one,
515 $ a( m1*m1 ), m1, b( m1, 0 ), ldb,
516 $ alpha, b, ldb )
517 CALL dtrsm(
'L',
'U',
'N', diag, m1, n, one,
518 $ a( 0 ), m1, b, ldb )
519 END IF
520
521 END IF
522
523 ELSE
524
525
526
527 IF( .NOT.notrans ) THEN
528
529
530
531
532 CALL dtrsm(
'L',
'U',
'T', diag, m1, n, alpha,
533 $ a( m2*m2 ), m2, b, ldb )
534 CALL dgemm(
'N',
'N', m2, n, m1, -one, a( 0 ),
535 $ m2,
536 $ b, ldb, alpha, b( m1, 0 ), ldb )
537 CALL dtrsm(
'L',
'L',
'N', diag, m2, n, one,
538 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
539
540 ELSE
541
542
543
544
545 CALL dtrsm(
'L',
'L',
'T', diag, m2, n, alpha,
546 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
547 CALL dgemm(
'T',
'N', m1, n, m2, -one, a( 0 ),
548 $ m2,
549 $ b( m1, 0 ), ldb, alpha, b, ldb )
550 CALL dtrsm(
'L',
'U',
'N', diag, m1, n, one,
551 $ a( m2*m2 ), m2, b, ldb )
552
553 END IF
554
555 END IF
556
557 END IF
558
559 ELSE
560
561
562
563 IF( normaltransr ) THEN
564
565
566
567 IF( lower ) THEN
568
569
570
571 IF( notrans ) THEN
572
573
574
575
576 CALL dtrsm(
'L',
'L',
'N', diag, k, n, alpha,
577 $ a( 1 ), m+1, b, ldb )
578 CALL dgemm(
'N',
'N', k, n, k, -one, a( k+1 ),
579 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
580 CALL dtrsm(
'L',
'U',
'T', diag, k, n, one,
581 $ a( 0 ), m+1, b( k, 0 ), ldb )
582
583 ELSE
584
585
586
587
588 CALL dtrsm(
'L',
'U',
'N', diag, k, n, alpha,
589 $ a( 0 ), m+1, b( k, 0 ), ldb )
590 CALL dgemm(
'T',
'N', k, n, k, -one, a( k+1 ),
591 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
592 CALL dtrsm(
'L',
'L',
'T', diag, k, n, one,
593 $ a( 1 ), m+1, b, ldb )
594
595 END IF
596
597 ELSE
598
599
600
601 IF( .NOT.notrans ) THEN
602
603
604
605
606 CALL dtrsm(
'L',
'L',
'N', diag, k, n, alpha,
607 $ a( k+1 ), m+1, b, ldb )
608 CALL dgemm(
'T',
'N', k, n, k, -one, a( 0 ),
609 $ m+1,
610 $ b, ldb, alpha, b( k, 0 ), ldb )
611 CALL dtrsm(
'L',
'U',
'T', diag, k, n, one,
612 $ a( k ), m+1, b( k, 0 ), ldb )
613
614 ELSE
615
616
617
618 CALL dtrsm(
'L',
'U',
'N', diag, k, n, alpha,
619 $ a( k ), m+1, b( k, 0 ), ldb )
620 CALL dgemm(
'N',
'N', k, n, k, -one, a( 0 ),
621 $ m+1,
622 $ b( k, 0 ), ldb, alpha, b, ldb )
623 CALL dtrsm(
'L',
'L',
'T', diag, k, n, one,
624 $ a( k+1 ), m+1, b, ldb )
625
626 END IF
627
628 END IF
629
630 ELSE
631
632
633
634 IF( lower ) THEN
635
636
637
638 IF( notrans ) THEN
639
640
641
642
643 CALL dtrsm(
'L',
'U',
'T', diag, k, n, alpha,
644 $ a( k ), k, b, ldb )
645 CALL dgemm(
'T',
'N', k, n, k, -one,
646 $ a( k*( k+1 ) ), k, b, ldb, alpha,
647 $ b( k, 0 ), ldb )
648 CALL dtrsm(
'L',
'L',
'N', diag, k, n, one,
649 $ a( 0 ), k, b( k, 0 ), ldb )
650
651 ELSE
652
653
654
655
656 CALL dtrsm(
'L',
'L',
'T', diag, k, n, alpha,
657 $ a( 0 ), k, b( k, 0 ), ldb )
658 CALL dgemm(
'N',
'N', k, n, k, -one,
659 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
660 $ alpha, b, ldb )
661 CALL dtrsm(
'L',
'U',
'N', diag, k, n, one,
662 $ a( k ), k, b, ldb )
663
664 END IF
665
666 ELSE
667
668
669
670 IF( .NOT.notrans ) THEN
671
672
673
674
675 CALL dtrsm(
'L',
'U',
'T', diag, k, n, alpha,
676 $ a( k*( k+1 ) ), k, b, ldb )
677 CALL dgemm(
'N',
'N', k, n, k, -one, a( 0 ), k,
678 $ b,
679 $ ldb, alpha, b( k, 0 ), ldb )
680 CALL dtrsm(
'L',
'L',
'N', diag, k, n, one,
681 $ a( k*k ), k, b( k, 0 ), ldb )
682
683 ELSE
684
685
686
687
688 CALL dtrsm(
'L',
'L',
'T', diag, k, n, alpha,
689 $ a( k*k ), k, b( k, 0 ), ldb )
690 CALL dgemm(
'T',
'N', k, n, k, -one, a( 0 ), k,
691 $ b( k, 0 ), ldb, alpha, b, ldb )
692 CALL dtrsm(
'L',
'U',
'N', diag, k, n, one,
693 $ a( k*( k+1 ) ), k, b, ldb )
694
695 END IF
696
697 END IF
698
699 END IF
700
701 END IF
702
703 ELSE
704
705
706
707
708
709
710
711 IF( mod( n, 2 ).EQ.0 ) THEN
712 nisodd = .false.
713 k = n / 2
714 ELSE
715 nisodd = .true.
716 IF( lower ) THEN
717 n2 = n / 2
718 n1 = n - n2
719 ELSE
720 n1 = n / 2
721 n2 = n - n1
722 END IF
723 END IF
724
725 IF( nisodd ) THEN
726
727
728
729 IF( normaltransr ) THEN
730
731
732
733 IF( lower ) THEN
734
735
736
737 IF( notrans ) THEN
738
739
740
741
742 CALL dtrsm(
'R',
'U',
'T', diag, m, n2, alpha,
743 $ a( n ), n, b( 0, n1 ), ldb )
744 CALL dgemm(
'N',
'N', m, n1, n2, -one, b( 0,
745 $ n1 ),
746 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
747 $ ldb )
748 CALL dtrsm(
'R',
'L',
'N', diag, m, n1, one,
749 $ a( 0 ), n, b( 0, 0 ), ldb )
750
751 ELSE
752
753
754
755
756 CALL dtrsm(
'R',
'L',
'T', diag, m, n1, alpha,
757 $ a( 0 ), n, b( 0, 0 ), ldb )
758 CALL dgemm(
'N',
'T', m, n2, n1, -one, b( 0,
759 $ 0 ),
760 $ ldb, a( n1 ), n, alpha, b( 0, n1 ),
761 $ ldb )
762 CALL dtrsm(
'R',
'U',
'N', diag, m, n2, one,
763 $ a( n ), n, b( 0, n1 ), ldb )
764
765 END IF
766
767 ELSE
768
769
770
771 IF( notrans ) THEN
772
773
774
775
776 CALL dtrsm(
'R',
'L',
'T', diag, m, n1, alpha,
777 $ a( n2 ), n, b( 0, 0 ), ldb )
778 CALL dgemm(
'N',
'N', m, n2, n1, -one, b( 0,
779 $ 0 ),
780 $ ldb, a( 0 ), n, alpha, b( 0, n1 ),
781 $ ldb )
782 CALL dtrsm(
'R',
'U',
'N', diag, m, n2, one,
783 $ a( n1 ), n, b( 0, n1 ), ldb )
784
785 ELSE
786
787
788
789
790 CALL dtrsm(
'R',
'U',
'T', diag, m, n2, alpha,
791 $ a( n1 ), n, b( 0, n1 ), ldb )
792 CALL dgemm(
'N',
'T', m, n1, n2, -one, b( 0,
793 $ n1 ),
794 $ ldb, a( 0 ), n, alpha, b( 0, 0 ), ldb )
795 CALL dtrsm(
'R',
'L',
'N', diag, m, n1, one,
796 $ a( n2 ), n, b( 0, 0 ), ldb )
797
798 END IF
799
800 END IF
801
802 ELSE
803
804
805
806 IF( lower ) THEN
807
808
809
810 IF( notrans ) THEN
811
812
813
814
815 CALL dtrsm(
'R',
'L',
'N', diag, m, n2, alpha,
816 $ a( 1 ), n1, b( 0, n1 ), ldb )
817 CALL dgemm(
'N',
'T', m, n1, n2, -one, b( 0,
818 $ n1 ),
819 $ ldb, a( n1*n1 ), n1, alpha, b( 0, 0 ),
820 $ ldb )
821 CALL dtrsm(
'R',
'U',
'T', diag, m, n1, one,
822 $ a( 0 ), n1, b( 0, 0 ), ldb )
823
824 ELSE
825
826
827
828
829 CALL dtrsm(
'R',
'U',
'N', diag, m, n1, alpha,
830 $ a( 0 ), n1, b( 0, 0 ), ldb )
831 CALL dgemm(
'N',
'N', m, n2, n1, -one, b( 0,
832 $ 0 ),
833 $ ldb, a( n1*n1 ), n1, alpha, b( 0, n1 ),
834 $ ldb )
835 CALL dtrsm(
'R',
'L',
'T', diag, m, n2, one,
836 $ a( 1 ), n1, b( 0, n1 ), ldb )
837
838 END IF
839
840 ELSE
841
842
843
844 IF( notrans ) THEN
845
846
847
848
849 CALL dtrsm(
'R',
'U',
'N', diag, m, n1, alpha,
850 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
851 CALL dgemm(
'N',
'T', m, n2, n1, -one, b( 0,
852 $ 0 ),
853 $ ldb, a( 0 ), n2, alpha, b( 0, n1 ),
854 $ ldb )
855 CALL dtrsm(
'R',
'L',
'T', diag, m, n2, one,
856 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
857
858 ELSE
859
860
861
862
863 CALL dtrsm(
'R',
'L',
'N', diag, m, n2, alpha,
864 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
865 CALL dgemm(
'N',
'N', m, n1, n2, -one, b( 0,
866 $ n1 ),
867 $ ldb, a( 0 ), n2, alpha, b( 0, 0 ),
868 $ ldb )
869 CALL dtrsm(
'R',
'U',
'T', diag, m, n1, one,
870 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
871
872 END IF
873
874 END IF
875
876 END IF
877
878 ELSE
879
880
881
882 IF( normaltransr ) THEN
883
884
885
886 IF( lower ) THEN
887
888
889
890 IF( notrans ) THEN
891
892
893
894
895 CALL dtrsm(
'R',
'U',
'T', diag, m, k, alpha,
896 $ a( 0 ), n+1, b( 0, k ), ldb )
897 CALL dgemm(
'N',
'N', m, k, k, -one, b( 0, k ),
898 $ ldb, a( k+1 ), n+1, alpha, b( 0, 0 ),
899 $ ldb )
900 CALL dtrsm(
'R',
'L',
'N', diag, m, k, one,
901 $ a( 1 ), n+1, b( 0, 0 ), ldb )
902
903 ELSE
904
905
906
907
908 CALL dtrsm(
'R',
'L',
'T', diag, m, k, alpha,
909 $ a( 1 ), n+1, b( 0, 0 ), ldb )
910 CALL dgemm(
'N',
'T', m, k, k, -one, b( 0, 0 ),
911 $ ldb, a( k+1 ), n+1, alpha, b( 0, k ),
912 $ ldb )
913 CALL dtrsm(
'R',
'U',
'N', diag, m, k, one,
914 $ a( 0 ), n+1, b( 0, k ), ldb )
915
916 END IF
917
918 ELSE
919
920
921
922 IF( notrans ) THEN
923
924
925
926
927 CALL dtrsm(
'R',
'L',
'T', diag, m, k, alpha,
928 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
929 CALL dgemm(
'N',
'N', m, k, k, -one, b( 0, 0 ),
930 $ ldb, a( 0 ), n+1, alpha, b( 0, k ),
931 $ ldb )
932 CALL dtrsm(
'R',
'U',
'N', diag, m, k, one,
933 $ a( k ), n+1, b( 0, k ), ldb )
934
935 ELSE
936
937
938
939
940 CALL dtrsm(
'R',
'U',
'T', diag, m, k, alpha,
941 $ a( k ), n+1, b( 0, k ), ldb )
942 CALL dgemm(
'N',
'T', m, k, k, -one, b( 0, k ),
943 $ ldb, a( 0 ), n+1, alpha, b( 0, 0 ),
944 $ ldb )
945 CALL dtrsm(
'R',
'L',
'N', diag, m, k, one,
946 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
947
948 END IF
949
950 END IF
951
952 ELSE
953
954
955
956 IF( lower ) THEN
957
958
959
960 IF( notrans ) THEN
961
962
963
964
965 CALL dtrsm(
'R',
'L',
'N', diag, m, k, alpha,
966 $ a( 0 ), k, b( 0, k ), ldb )
967 CALL dgemm(
'N',
'T', m, k, k, -one, b( 0, k ),
968 $ ldb, a( ( k+1 )*k ), k, alpha,
969 $ b( 0, 0 ), ldb )
970 CALL dtrsm(
'R',
'U',
'T', diag, m, k, one,
971 $ a( k ), k, b( 0, 0 ), ldb )
972
973 ELSE
974
975
976
977
978 CALL dtrsm(
'R',
'U',
'N', diag, m, k, alpha,
979 $ a( k ), k, b( 0, 0 ), ldb )
980 CALL dgemm(
'N',
'N', m, k, k, -one, b( 0, 0 ),
981 $ ldb, a( ( k+1 )*k ), k, alpha,
982 $ b( 0, k ), ldb )
983 CALL dtrsm(
'R',
'L',
'T', diag, m, k, one,
984 $ a( 0 ), k, b( 0, k ), ldb )
985
986 END IF
987
988 ELSE
989
990
991
992 IF( notrans ) THEN
993
994
995
996
997 CALL dtrsm(
'R',
'U',
'N', diag, m, k, alpha,
998 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )
999 CALL dgemm(
'N',
'T', m, k, k, -one, b( 0, 0 ),
1000 $ ldb, a( 0 ), k, alpha, b( 0, k ), ldb )
1001 CALL dtrsm(
'R',
'L',
'T', diag, m, k, one,
1002 $ a( k*k ), k, b( 0, k ), ldb )
1003
1004 ELSE
1005
1006
1007
1008
1009 CALL dtrsm(
'R',
'L',
'N', diag, m, k, alpha,
1010 $ a( k*k ), k, b( 0, k ), ldb )
1011 CALL dgemm(
'N',
'N', m, k, k, -one, b( 0, k ),
1012 $ ldb, a( 0 ), k, alpha, b( 0, 0 ), ldb )
1013 CALL dtrsm(
'R',
'U',
'T', diag, m, k, one,
1014 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )
1015
1016 END IF
1017
1018 END IF
1019
1020 END IF
1021
1022 END IF
1023 END IF
1024
1025 RETURN
1026
1027
1028
subroutine xerbla(srname, info)
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
logical function lsame(ca, cb)
LSAME
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM