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