249
250
251
252
253
254
255 CHARACTER DIRECT, SIDE, STOREV, TRANS
256 INTEGER K, L, LDA, LDB, LDT, LDV, LDWORK, M, N
257
258
259 COMPLEX A( LDA, * ), B( LDB, * ), T( LDT, * ),
260 $ V( LDV, * ), WORK( LDWORK, * )
261
262
263
264
265
266 COMPLEX ONE, ZERO
267 parameter( one = (1.0,0.0), zero = (0.0,0.0) )
268
269
270 INTEGER I, J, MP, NP, KP
271 LOGICAL LEFT, FORWARD, COLUMN, RIGHT, BACKWARD, ROW
272
273
274 LOGICAL LSAME
276
277
279
280
281 INTRINSIC conjg
282
283
284
285
286
287 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 .OR. l.LT.0 ) RETURN
288
289 IF(
lsame( storev,
'C' ) )
THEN
290 column = .true.
291 row = .false.
292 ELSE IF (
lsame( storev,
'R' ) )
THEN
293 column = .false.
294 row = .true.
295 ELSE
296 column = .false.
297 row = .false.
298 END IF
299
300 IF(
lsame( side,
'L' ) )
THEN
301 left = .true.
302 right = .false.
303 ELSE IF(
lsame( side,
'R' ) )
THEN
304 left = .false.
305 right = .true.
306 ELSE
307 left = .false.
308 right = .false.
309 END IF
310
311 IF(
lsame( direct,
'F' ) )
THEN
312 forward = .true.
313 backward = .false.
314 ELSE IF(
lsame( direct,
'B' ) )
THEN
315 forward = .false.
316 backward = .true.
317 ELSE
318 forward = .false.
319 backward = .false.
320 END IF
321
322
323
324 IF( column .AND. forward .AND. left ) THEN
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341 mp = min( m-l+1, m )
342 kp = min( l+1, k )
343
344 DO j = 1, n
345 DO i = 1, l
346 work( i, j ) = b( m-l+i, j )
347 END DO
348 END DO
349 CALL ctrmm(
'L',
'U',
'C',
'N', l, n, one, v( mp, 1 ), ldv,
350 $ work, ldwork )
351 CALL cgemm(
'C',
'N', l, n, m-l, one, v, ldv, b, ldb,
352 $ one, work, ldwork )
353 CALL cgemm(
'C',
'N', k-l, n, m, one, v( 1, kp ), ldv,
354 $ b, ldb, zero, work( kp, 1 ), ldwork )
355
356 DO j = 1, n
357 DO i = 1, k
358 work( i, j ) = work( i, j ) + a( i, j )
359 END DO
360 END DO
361
362 CALL ctrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
363 $ work, ldwork )
364
365 DO j = 1, n
366 DO i = 1, k
367 a( i, j ) = a( i, j ) - work( i, j )
368 END DO
369 END DO
370
371 CALL cgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
372 $ one, b, ldb )
373 CALL cgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv,
374 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
375 CALL ctrmm(
'L',
'U',
'N',
'N', l, n, one, v( mp, 1 ), ldv,
376 $ work, ldwork )
377 DO j = 1, n
378 DO i = 1, l
379 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
380 END DO
381 END DO
382
383
384
385 ELSE IF( column .AND. forward .AND. right ) THEN
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401 np = min( n-l+1, n )
402 kp = min( l+1, k )
403
404 DO j = 1, l
405 DO i = 1, m
406 work( i, j ) = b( i, n-l+j )
407 END DO
408 END DO
409 CALL ctrmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
410 $ work, ldwork )
411 CALL cgemm(
'N',
'N', m, l, n-l, one, b, ldb,
412 $ v, ldv, one, work, ldwork )
413 CALL cgemm(
'N',
'N', m, k-l, n, one, b, ldb,
414 $ v( 1, kp ), ldv, zero, work( 1, kp ), ldwork )
415
416 DO j = 1, k
417 DO i = 1, m
418 work( i, j ) = work( i, j ) + a( i, j )
419 END DO
420 END DO
421
422 CALL ctrmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
423 $ work, ldwork )
424
425 DO j = 1, k
426 DO i = 1, m
427 a( i, j ) = a( i, j ) - work( i, j )
428 END DO
429 END DO
430
431 CALL cgemm(
'N',
'C', m, n-l, k, -one, work, ldwork,
432 $ v, ldv, one, b, ldb )
433 CALL cgemm(
'N',
'C', m, l, k-l, -one, work( 1, kp ),
434 $ ldwork,
435 $ v( np, kp ), ldv, one, b( 1, np ), ldb )
436 CALL ctrmm(
'R',
'U',
'C',
'N', m, l, one, v( np, 1 ), ldv,
437 $ work, ldwork )
438 DO j = 1, l
439 DO i = 1, m
440 b( i, n-l+j ) = b( i, n-l+j ) - work( i, j )
441 END DO
442 END DO
443
444
445
446 ELSE IF( column .AND. backward .AND. left ) THEN
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463 mp = min( l+1, m )
464 kp = min( k-l+1, k )
465
466 DO j = 1, n
467 DO i = 1, l
468 work( k-l+i, j ) = b( i, j )
469 END DO
470 END DO
471
472 CALL ctrmm(
'L',
'L',
'C',
'N', l, n, one, v( 1, kp ), ldv,
473 $ work( kp, 1 ), ldwork )
474 CALL cgemm(
'C',
'N', l, n, m-l, one, v( mp, kp ), ldv,
475 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
476 CALL cgemm(
'C',
'N', k-l, n, m, one, v, ldv,
477 $ b, ldb, zero, work, ldwork )
478
479 DO j = 1, n
480 DO i = 1, k
481 work( i, j ) = work( i, j ) + a( i, j )
482 END DO
483 END DO
484
485 CALL ctrmm(
'L',
'L', trans,
'N', k, n, one, t, ldt,
486 $ work, ldwork )
487
488 DO j = 1, n
489 DO i = 1, k
490 a( i, j ) = a( i, j ) - work( i, j )
491 END DO
492 END DO
493
494 CALL cgemm(
'N',
'N', m-l, n, k, -one, v( mp, 1 ), ldv,
495 $ work, ldwork, one, b( mp, 1 ), ldb )
496 CALL cgemm(
'N',
'N', l, n, k-l, -one, v, ldv,
497 $ work, ldwork, one, b, ldb )
498 CALL ctrmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, kp ), ldv,
499 $ work( kp, 1 ), ldwork )
500 DO j = 1, n
501 DO i = 1, l
502 b( i, j ) = b( i, j ) - work( k-l+i, j )
503 END DO
504 END DO
505
506
507
508 ELSE IF( column .AND. backward .AND. right ) THEN
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524 np = min( l+1, n )
525 kp = min( k-l+1, k )
526
527 DO j = 1, l
528 DO i = 1, m
529 work( i, k-l+j ) = b( i, j )
530 END DO
531 END DO
532 CALL ctrmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, kp ), ldv,
533 $ work( 1, kp ), ldwork )
534 CALL cgemm(
'N',
'N', m, l, n-l, one, b( 1, np ), ldb,
535 $ v( np, kp ), ldv, one, work( 1, kp ), ldwork )
536 CALL cgemm(
'N',
'N', m, k-l, n, one, b, ldb,
537 $ v, ldv, zero, work, ldwork )
538
539 DO j = 1, k
540 DO i = 1, m
541 work( i, j ) = work( i, j ) + a( i, j )
542 END DO
543 END DO
544
545 CALL ctrmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
546 $ work, ldwork )
547
548 DO j = 1, k
549 DO i = 1, m
550 a( i, j ) = a( i, j ) - work( i, j )
551 END DO
552 END DO
553
554 CALL cgemm(
'N',
'C', m, n-l, k, -one, work, ldwork,
555 $ v( np, 1 ), ldv, one, b( 1, np ), ldb )
556 CALL cgemm(
'N',
'C', m, l, k-l, -one, work, ldwork,
557 $ v, ldv, one, b, ldb )
558 CALL ctrmm(
'R',
'L',
'C',
'N', m, l, one, v( 1, kp ), ldv,
559 $ work( 1, kp ), ldwork )
560 DO j = 1, l
561 DO i = 1, m
562 b( i, j ) = b( i, j ) - work( i, k-l+j )
563 END DO
564 END DO
565
566
567
568 ELSE IF( row .AND. forward .AND. left ) THEN
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584 mp = min( m-l+1, m )
585 kp = min( l+1, k )
586
587 DO j = 1, n
588 DO i = 1, l
589 work( i, j ) = b( m-l+i, j )
590 END DO
591 END DO
592 CALL ctrmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, mp ), ldv,
593 $ work, ldb )
594 CALL cgemm(
'N',
'N', l, n, m-l, one, v, ldv,b, ldb,
595 $ one, work, ldwork )
596 CALL cgemm(
'N',
'N', k-l, n, m, one, v( kp, 1 ), ldv,
597 $ b, ldb, zero, work( kp, 1 ), ldwork )
598
599 DO j = 1, n
600 DO i = 1, k
601 work( i, j ) = work( i, j ) + a( i, j )
602 END DO
603 END DO
604
605 CALL ctrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
606 $ work, ldwork )
607
608 DO j = 1, n
609 DO i = 1, k
610 a( i, j ) = a( i, j ) - work( i, j )
611 END DO
612 END DO
613
614 CALL cgemm(
'C',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
615 $ one, b, ldb )
616 CALL cgemm(
'C',
'N', l, n, k-l, -one, v( kp, mp ), ldv,
617 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
618 CALL ctrmm(
'L',
'L',
'C',
'N', l, n, one, v( 1, mp ), ldv,
619 $ work, ldwork )
620 DO j = 1, n
621 DO i = 1, l
622 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
623 END DO
624 END DO
625
626
627
628 ELSE IF( row .AND. forward .AND. right ) THEN
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643 np = min( n-l+1, n )
644 kp = min( l+1, k )
645
646 DO j = 1, l
647 DO i = 1, m
648 work( i, j ) = b( i, n-l+j )
649 END DO
650 END DO
651 CALL ctrmm(
'R',
'L',
'C',
'N', m, l, one, v( 1, np ), ldv,
652 $ work, ldwork )
653 CALL cgemm(
'N',
'C', m, l, n-l, one, b, ldb, v, ldv,
654 $ one, work, ldwork )
655 CALL cgemm(
'N',
'C', m, k-l, n, one, b, ldb,
656 $ v( kp, 1 ), ldv, zero, work( 1, kp ), ldwork )
657
658 DO j = 1, k
659 DO i = 1, m
660 work( i, j ) = work( i, j ) + a( i, j )
661 END DO
662 END DO
663
664 CALL ctrmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
665 $ work, ldwork )
666
667 DO j = 1, k
668 DO i = 1, m
669 a( i, j ) = a( i, j ) - work( i, j )
670 END DO
671 END DO
672
673 CALL cgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
674 $ v, ldv, one, b, ldb )
675 CALL cgemm(
'N',
'N', m, l, k-l, -one, work( 1, kp ),
676 $ ldwork,
677 $ v( kp, np ), ldv, one, b( 1, np ), ldb )
678 CALL ctrmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, np ), ldv,
679 $ work, ldwork )
680 DO j = 1, l
681 DO i = 1, m
682 b( i, n-l+j ) = b( i, n-l+j ) - work( i, j )
683 END DO
684 END DO
685
686
687
688 ELSE IF( row .AND. backward .AND. left ) THEN
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704 mp = min( l+1, m )
705 kp = min( k-l+1, k )
706
707 DO j = 1, n
708 DO i = 1, l
709 work( k-l+i, j ) = b( i, j )
710 END DO
711 END DO
712 CALL ctrmm(
'L',
'U',
'N',
'N', l, n, one, v( kp, 1 ), ldv,
713 $ work( kp, 1 ), ldwork )
714 CALL cgemm(
'N',
'N', l, n, m-l, one, v( kp, mp ), ldv,
715 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
716 CALL cgemm(
'N',
'N', k-l, n, m, one, v, ldv, b, ldb,
717 $ zero, work, ldwork )
718
719 DO j = 1, n
720 DO i = 1, k
721 work( i, j ) = work( i, j ) + a( i, j )
722 END DO
723 END DO
724
725 CALL ctrmm(
'L',
'L ', trans,
'N', k, n, one, t, ldt,
726 $ work, ldwork )
727
728 DO j = 1, n
729 DO i = 1, k
730 a( i, j ) = a( i, j ) - work( i, j )
731 END DO
732 END DO
733
734 CALL cgemm(
'C',
'N', m-l, n, k, -one, v( 1, mp ), ldv,
735 $ work, ldwork, one, b( mp, 1 ), ldb )
736 CALL cgemm(
'C',
'N', l, n, k-l, -one, v, ldv,
737 $ work, ldwork, one, b, ldb )
738 CALL ctrmm(
'L',
'U',
'C',
'N', l, n, one, v( kp, 1 ), ldv,
739 $ work( kp, 1 ), ldwork )
740 DO j = 1, n
741 DO i = 1, l
742 b( i, j ) = b( i, j ) - work( k-l+i, j )
743 END DO
744 END DO
745
746
747
748 ELSE IF( row .AND. backward .AND. right ) THEN
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763 np = min( l+1, n )
764 kp = min( k-l+1, k )
765
766 DO j = 1, l
767 DO i = 1, m
768 work( i, k-l+j ) = b( i, j )
769 END DO
770 END DO
771 CALL ctrmm(
'R',
'U',
'C',
'N', m, l, one, v( kp, 1 ), ldv,
772 $ work( 1, kp ), ldwork )
773 CALL cgemm(
'N',
'C', m, l, n-l, one, b( 1, np ), ldb,
774 $ v( kp, np ), ldv, one, work( 1, kp ), ldwork )
775 CALL cgemm(
'N',
'C', m, k-l, n, one, b, ldb, v, ldv,
776 $ zero, work, ldwork )
777
778 DO j = 1, k
779 DO i = 1, m
780 work( i, j ) = work( i, j ) + a( i, j )
781 END DO
782 END DO
783
784 CALL ctrmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
785 $ work, ldwork )
786
787 DO j = 1, k
788 DO i = 1, m
789 a( i, j ) = a( i, j ) - work( i, j )
790 END DO
791 END DO
792
793 CALL cgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
794 $ v( 1, np ), ldv, one, b( 1, np ), ldb )
795 CALL cgemm(
'N',
'N', m, l, k-l , -one, work, ldwork,
796 $ v, ldv, one, b, ldb )
797 CALL ctrmm(
'R',
'U',
'N',
'N', m, l, one, v( kp, 1 ), ldv,
798 $ work( 1, kp ), ldwork )
799 DO j = 1, l
800 DO i = 1, m
801 b( i, j ) = b( i, j ) - work( i, k-l+j )
802 END DO
803 END DO
804
805 END IF
806
807 RETURN
808
809
810
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
logical function lsame(ca, cb)
LSAME
subroutine ctrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRMM