195
  196
  197
  198
  199
  200
  201      CHARACTER          DIRECT, SIDE, STOREV, TRANS
  202      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
  203
  204
  205      REAL               C( LDC, * ), T( LDT, * ), V( LDV, * ),
  206     $                   WORK( LDWORK, * )
  207
  208
  209
  210
  211
  212      REAL               ONE
  213      parameter( one = 1.0e+0 )
  214
  215
  216      CHARACTER          TRANST
  217      INTEGER            I, J
  218
  219
  220      LOGICAL            LSAME
  222
  223
  225
  226
  227
  228
  229
  230      IF( m.LE.0 .OR. n.LE.0 )
  231     $   RETURN
  232
  233      IF( 
lsame( trans, 
'N' ) ) 
THEN 
  234         transt = 'T'
  235      ELSE
  236         transt = 'N'
  237      END IF
  238
  239      IF( 
lsame( storev, 
'C' ) ) 
THEN 
  240
  241         IF( 
lsame( direct, 
'F' ) ) 
THEN 
  242
  243
  244
  245
  246
  247            IF( 
lsame( side, 
'L' ) ) 
THEN 
  248
  249
  250
  251
  252
  253
  254
  255
  256               DO 10 j = 1, k
  257                  CALL scopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
 
  258   10          CONTINUE
  259
  260
  261
  262               CALL strmm( 
'Right', 
'Lower', 
'No transpose', 
'Unit',
 
  263     $                     n,
  264     $                     k, one, v, ldv, work, ldwork )
  265               IF( m.GT.k ) THEN
  266
  267
  268
  269                  CALL sgemm( 
'Transpose', 
'No transpose', n, k, m-k,
 
  270     $                        one, c( k+1, 1 ), ldc, v( k+1, 1 ), ldv,
  271     $                        one, work, ldwork )
  272               END IF
  273
  274
  275
  276               CALL strmm( 
'Right', 
'Upper', transt, 
'Non-unit', n,
 
  277     $                     k,
  278     $                     one, t, ldt, work, ldwork )
  279
  280
  281
  282               IF( m.GT.k ) THEN
  283
  284
  285
  286                  CALL sgemm( 
'No transpose', 
'Transpose', m-k, n, k,
 
  287     $                        -one, v( k+1, 1 ), ldv, work, ldwork, one,
  288     $                        c( k+1, 1 ), ldc )
  289               END IF
  290
  291
  292
  293               CALL strmm( 
'Right', 
'Lower', 
'Transpose', 
'Unit', n,
 
  294     $                     k,
  295     $                     one, v, ldv, work, ldwork )
  296
  297
  298
  299               DO 30 j = 1, k
  300                  DO 20 i = 1, n
  301                     c( j, i ) = c( j, i ) - work( i, j )
  302   20             CONTINUE
  303   30          CONTINUE
  304
  305            ELSE IF( 
lsame( side, 
'R' ) ) 
THEN 
  306
  307
  308
  309
  310
  311
  312
  313               DO 40 j = 1, k
  314                  CALL scopy( m, c( 1, j ), 1, work( 1, j ), 1 )
 
  315   40          CONTINUE
  316
  317
  318
  319               CALL strmm( 
'Right', 
'Lower', 
'No transpose', 
'Unit',
 
  320     $                     m,
  321     $                     k, one, v, ldv, work, ldwork )
  322               IF( n.GT.k ) THEN
  323
  324
  325
  326                  CALL sgemm( 
'No transpose', 
'No transpose', m, k,
 
  327     $                        n-k,
  328     $                        one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
  329     $                        one, work, ldwork )
  330               END IF
  331
  332
  333
  334               CALL strmm( 
'Right', 
'Upper', trans, 
'Non-unit', m, k,
 
  335     $                     one, t, ldt, work, ldwork )
  336
  337
  338
  339               IF( n.GT.k ) THEN
  340
  341
  342
  343                  CALL sgemm( 
'No transpose', 
'Transpose', m, n-k, k,
 
  344     $                        -one, work, ldwork, v( k+1, 1 ), ldv, one,
  345     $                        c( 1, k+1 ), ldc )
  346               END IF
  347
  348
  349
  350               CALL strmm( 
'Right', 
'Lower', 
'Transpose', 
'Unit', m,
 
  351     $                     k,
  352     $                     one, v, ldv, work, ldwork )
  353
  354
  355
  356               DO 60 j = 1, k
  357                  DO 50 i = 1, m
  358                     c( i, j ) = c( i, j ) - work( i, j )
  359   50             CONTINUE
  360   60          CONTINUE
  361            END IF
  362
  363         ELSE
  364
  365
  366
  367
  368
  369            IF( 
lsame( side, 
'L' ) ) 
THEN 
  370
  371
  372
  373
  374
  375
  376
  377
  378               DO 70 j = 1, k
  379                  CALL scopy( n, c( m-k+j, 1 ), ldc, work( 1, j ),
 
  380     $                        1 )
  381   70          CONTINUE
  382
  383
  384
  385               CALL strmm( 
'Right', 
'Upper', 
'No transpose', 
'Unit',
 
  386     $                     n,
  387     $                     k, one, v( m-k+1, 1 ), ldv, work, ldwork )
  388               IF( m.GT.k ) THEN
  389
  390
  391
  392                  CALL sgemm( 
'Transpose', 
'No transpose', n, k, m-k,
 
  393     $                        one, c, ldc, v, ldv, one, work, ldwork )
  394               END IF
  395
  396
  397
  398               CALL strmm( 
'Right', 
'Lower', transt, 
'Non-unit', n,
 
  399     $                     k,
  400     $                     one, t, ldt, work, ldwork )
  401
  402
  403
  404               IF( m.GT.k ) THEN
  405
  406
  407
  408                  CALL sgemm( 
'No transpose', 
'Transpose', m-k, n, k,
 
  409     $                        -one, v, ldv, work, ldwork, one, c, ldc )
  410               END IF
  411
  412
  413
  414               CALL strmm( 
'Right', 
'Upper', 
'Transpose', 
'Unit', n,
 
  415     $                     k,
  416     $                     one, v( m-k+1, 1 ), ldv, work, ldwork )
  417
  418
  419
  420               DO 90 j = 1, k
  421                  DO 80 i = 1, n
  422                     c( m-k+j, i ) = c( m-k+j, i ) - work( i, j )
  423   80             CONTINUE
  424   90          CONTINUE
  425
  426            ELSE IF( 
lsame( side, 
'R' ) ) 
THEN 
  427
  428
  429
  430
  431
  432
  433
  434               DO 100 j = 1, k
  435                  CALL scopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
 
  436  100          CONTINUE
  437
  438
  439
  440               CALL strmm( 
'Right', 
'Upper', 
'No transpose', 
'Unit',
 
  441     $                     m,
  442     $                     k, one, v( n-k+1, 1 ), ldv, work, ldwork )
  443               IF( n.GT.k ) THEN
  444
  445
  446
  447                  CALL sgemm( 
'No transpose', 
'No transpose', m, k,
 
  448     $                        n-k,
  449     $                        one, c, ldc, v, ldv, one, work, ldwork )
  450               END IF
  451
  452
  453
  454               CALL strmm( 
'Right', 
'Lower', trans, 
'Non-unit', m, k,
 
  455     $                     one, t, ldt, work, ldwork )
  456
  457
  458
  459               IF( n.GT.k ) THEN
  460
  461
  462
  463                  CALL sgemm( 
'No transpose', 
'Transpose', m, n-k, k,
 
  464     $                        -one, work, ldwork, v, ldv, one, c, ldc )
  465               END IF
  466
  467
  468
  469               CALL strmm( 
'Right', 
'Upper', 
'Transpose', 
'Unit', m,
 
  470     $                     k,
  471     $                     one, v( n-k+1, 1 ), ldv, work, ldwork )
  472
  473
  474
  475               DO 120 j = 1, k
  476                  DO 110 i = 1, m
  477                     c( i, n-k+j ) = c( i, n-k+j ) - work( i, j )
  478  110             CONTINUE
  479  120          CONTINUE
  480            END IF
  481         END IF
  482
  483      ELSE IF( 
lsame( storev, 
'R' ) ) 
THEN 
  484
  485         IF( 
lsame( direct, 
'F' ) ) 
THEN 
  486
  487
  488
  489
  490            IF( 
lsame( side, 
'L' ) ) 
THEN 
  491
  492
  493
  494
  495
  496
  497
  498
  499               DO 130 j = 1, k
  500                  CALL scopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
 
  501  130          CONTINUE
  502
  503
  504
  505               CALL strmm( 
'Right', 
'Upper', 
'Transpose', 
'Unit', n,
 
  506     $                     k,
  507     $                     one, v, ldv, work, ldwork )
  508               IF( m.GT.k ) THEN
  509
  510
  511
  512                  CALL sgemm( 
'Transpose', 
'Transpose', n, k, m-k,
 
  513     $                        one,
  514     $                        c( k+1, 1 ), ldc, v( 1, k+1 ), ldv, one,
  515     $                        work, ldwork )
  516               END IF
  517
  518
  519
  520               CALL strmm( 
'Right', 
'Upper', transt, 
'Non-unit', n,
 
  521     $                     k,
  522     $                     one, t, ldt, work, ldwork )
  523
  524
  525
  526               IF( m.GT.k ) THEN
  527
  528
  529
  530                  CALL sgemm( 
'Transpose', 
'Transpose', m-k, n, k,
 
  531     $                        -one,
  532     $                        v( 1, k+1 ), ldv, work, ldwork, one,
  533     $                        c( k+1, 1 ), ldc )
  534               END IF
  535
  536
  537
  538               CALL strmm( 
'Right', 
'Upper', 
'No transpose', 
'Unit',
 
  539     $                     n,
  540     $                     k, one, v, ldv, work, ldwork )
  541
  542
  543
  544               DO 150 j = 1, k
  545                  DO 140 i = 1, n
  546                     c( j, i ) = c( j, i ) - work( i, j )
  547  140             CONTINUE
  548  150          CONTINUE
  549
  550            ELSE IF( 
lsame( side, 
'R' ) ) 
THEN 
  551
  552
  553
  554
  555
  556
  557
  558               DO 160 j = 1, k
  559                  CALL scopy( m, c( 1, j ), 1, work( 1, j ), 1 )
 
  560  160          CONTINUE
  561
  562
  563
  564               CALL strmm( 
'Right', 
'Upper', 
'Transpose', 
'Unit', m,
 
  565     $                     k,
  566     $                     one, v, ldv, work, ldwork )
  567               IF( n.GT.k ) THEN
  568
  569
  570
  571                  CALL sgemm( 
'No transpose', 
'Transpose', m, k, n-k,
 
  572     $                        one, c( 1, k+1 ), ldc, v( 1, k+1 ), ldv,
  573     $                        one, work, ldwork )
  574               END IF
  575
  576
  577
  578               CALL strmm( 
'Right', 
'Upper', trans, 
'Non-unit', m, k,
 
  579     $                     one, t, ldt, work, ldwork )
  580
  581
  582
  583               IF( n.GT.k ) THEN
  584
  585
  586
  587                  CALL sgemm( 
'No transpose', 
'No transpose', m, n-k,
 
  588     $                        k,
  589     $                        -one, work, ldwork, v( 1, k+1 ), ldv, one,
  590     $                        c( 1, k+1 ), ldc )
  591               END IF
  592
  593
  594
  595               CALL strmm( 
'Right', 
'Upper', 
'No transpose', 
'Unit',
 
  596     $                     m,
  597     $                     k, one, v, ldv, work, ldwork )
  598
  599
  600
  601               DO 180 j = 1, k
  602                  DO 170 i = 1, m
  603                     c( i, j ) = c( i, j ) - work( i, j )
  604  170             CONTINUE
  605  180          CONTINUE
  606
  607            END IF
  608
  609         ELSE
  610
  611
  612
  613
  614            IF( 
lsame( side, 
'L' ) ) 
THEN 
  615
  616
  617
  618
  619
  620
  621
  622
  623               DO 190 j = 1, k
  624                  CALL scopy( n, c( m-k+j, 1 ), ldc, work( 1, j ),
 
  625     $                        1 )
  626  190          CONTINUE
  627
  628
  629
  630               CALL strmm( 
'Right', 
'Lower', 
'Transpose', 
'Unit', n,
 
  631     $                     k,
  632     $                     one, v( 1, m-k+1 ), ldv, work, ldwork )
  633               IF( m.GT.k ) THEN
  634
  635
  636
  637                  CALL sgemm( 
'Transpose', 
'Transpose', n, k, m-k,
 
  638     $                        one,
  639     $                        c, ldc, v, ldv, one, work, ldwork )
  640               END IF
  641
  642
  643
  644               CALL strmm( 
'Right', 
'Lower', transt, 
'Non-unit', n,
 
  645     $                     k,
  646     $                     one, t, ldt, work, ldwork )
  647
  648
  649
  650               IF( m.GT.k ) THEN
  651
  652
  653
  654                  CALL sgemm( 
'Transpose', 
'Transpose', m-k, n, k,
 
  655     $                        -one,
  656     $                        v, ldv, work, ldwork, one, c, ldc )
  657               END IF
  658
  659
  660
  661               CALL strmm( 
'Right', 
'Lower', 
'No transpose', 
'Unit',
 
  662     $                     n,
  663     $                     k, one, v( 1, m-k+1 ), ldv, work, ldwork )
  664
  665
  666
  667               DO 210 j = 1, k
  668                  DO 200 i = 1, n
  669                     c( m-k+j, i ) = c( m-k+j, i ) - work( i, j )
  670  200             CONTINUE
  671  210          CONTINUE
  672
  673            ELSE IF( 
lsame( side, 
'R' ) ) 
THEN 
  674
  675
  676
  677
  678
  679
  680
  681               DO 220 j = 1, k
  682                  CALL scopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
 
  683  220          CONTINUE
  684
  685
  686
  687               CALL strmm( 
'Right', 
'Lower', 
'Transpose', 
'Unit', m,
 
  688     $                     k,
  689     $                     one, v( 1, n-k+1 ), ldv, work, ldwork )
  690               IF( n.GT.k ) THEN
  691
  692
  693
  694                  CALL sgemm( 
'No transpose', 
'Transpose', m, k, n-k,
 
  695     $                        one, c, ldc, v, ldv, one, work, ldwork )
  696               END IF
  697
  698
  699
  700               CALL strmm( 
'Right', 
'Lower', trans, 
'Non-unit', m, k,
 
  701     $                     one, t, ldt, work, ldwork )
  702
  703
  704
  705               IF( n.GT.k ) THEN
  706
  707
  708
  709                  CALL sgemm( 
'No transpose', 
'No transpose', m, n-k,
 
  710     $                        k,
  711     $                        -one, work, ldwork, v, ldv, one, c, ldc )
  712               END IF
  713
  714
  715
  716               CALL strmm( 
'Right', 
'Lower', 
'No transpose', 
'Unit',
 
  717     $                     m,
  718     $                     k, one, v( 1, n-k+1 ), ldv, work, ldwork )
  719
  720
  721
  722               DO 240 j = 1, k
  723                  DO 230 i = 1, m
  724                     c( i, n-k+j ) = c( i, n-k+j ) - work( i, j )
  725  230             CONTINUE
  726  240          CONTINUE
  727
  728            END IF
  729
  730         END IF
  731      END IF
  732
  733      RETURN
  734
  735
  736
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
 
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
 
logical function lsame(ca, cb)
LSAME
 
subroutine strmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRMM