466
467
468
469
470
471
472
473
474
475
476 COMPLEX*16 ZERO, HALF
477 parameter( zero = ( 0.0d0, 0.0d0 ),
478 $ half = ( 0.5d0, 0.0d0 ) )
479 DOUBLE PRECISION RZERO
480 parameter( rzero = 0.0d0 )
481
482 DOUBLE PRECISION EPS, THRESH
483 INTEGER INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
484 $ NOUT, NTRA, IORDER
485 LOGICAL FATAL, REWI, TRACE
486 CHARACTER*12 SNAME
487
488 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
489 $ AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
490 $ XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
491 $ Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
492 $ YY( NMAX*INCMAX )
493 DOUBLE PRECISION G( NMAX )
494 INTEGER IDIM( NIDIM ), INC( NINC ), KB( NKB )
495
496 COMPLEX*16 ALPHA, ALS, BETA, BLS, TRANSL
497 DOUBLE PRECISION ERR, ERRMAX
498 INTEGER I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
499 $ INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
500 $ LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
501 $ NL, NS
502 LOGICAL BANDED, FULL, NULL, RESET, SAME, TRAN
503 CHARACTER*1 TRANS, TRANSS
504 CHARACTER*14 CTRANS
505 CHARACTER*3 ICH
506
507 LOGICAL ISAME( 13 )
508
509 LOGICAL LZE, LZERES
511
513
514 INTRINSIC abs, max, min
515
516 INTEGER INFOT, NOUTC
517 LOGICAL OK
518
519 COMMON /infoc/infot, noutc, ok
520
521 DATA ich/'NTC'/
522
523 full = sname( 9: 9 ).EQ.'e'
524 banded = sname( 9: 9 ).EQ.'b'
525
526 IF( full )THEN
527 nargs = 11
528 ELSE IF( banded )THEN
529 nargs = 13
530 END IF
531
532 nc = 0
533 reset = .true.
534 errmax = rzero
535
536 DO 120 in = 1, nidim
537 n = idim( in )
538 nd = n/2 + 1
539
540 DO 110 im = 1, 2
541 IF( im.EQ.1 )
542 $ m = max( n - nd, 0 )
543 IF( im.EQ.2 )
544 $ m = min( n + nd, nmax )
545
546 IF( banded )THEN
547 nk = nkb
548 ELSE
549 nk = 1
550 END IF
551 DO 100 iku = 1, nk
552 IF( banded )THEN
553 ku = kb( iku )
554 kl = max( ku - 1, 0 )
555 ELSE
556 ku = n - 1
557 kl = m - 1
558 END IF
559
560 IF( banded )THEN
561 lda = kl + ku + 1
562 ELSE
563 lda = m
564 END IF
565 IF( lda.LT.nmax )
566 $ lda = lda + 1
567
568 IF( lda.GT.nmax )
569 $ GO TO 100
570 laa = lda*n
571 null = n.LE.0.OR.m.LE.0
572
573
574
575 transl = zero
576 CALL zmake( sname( 8: 9 ),
' ',
' ', m, n, a, nmax, aa,
577 $ lda, kl, ku, reset, transl )
578
579 DO 90 ic = 1, 3
580 trans = ich( ic: ic )
581 IF (trans.EQ.'N')THEN
582 ctrans = ' CblasNoTrans'
583 ELSE IF (trans.EQ.'T')THEN
584 ctrans = ' CblasTrans'
585 ELSE
586 ctrans = 'CblasConjTrans'
587 END IF
588 tran = trans.EQ.'T'.OR.trans.EQ.'C'
589
590 IF( tran )THEN
591 ml = n
592 nl = m
593 ELSE
594 ml = m
595 nl = n
596 END IF
597
598 DO 80 ix = 1, ninc
599 incx = inc( ix )
600 lx = abs( incx )*nl
601
602
603
604 transl = half
605 CALL zmake(
'ge',
' ',
' ', 1, nl, x, 1, xx,
606 $ abs( incx ), 0, nl - 1, reset, transl )
607 IF( nl.GT.1 )THEN
608 x( nl/2 ) = zero
609 xx( 1 + abs( incx )*( nl/2 - 1 ) ) = zero
610 END IF
611
612 DO 70 iy = 1, ninc
613 incy = inc( iy )
614 ly = abs( incy )*ml
615
616 DO 60 ia = 1, nalf
617 alpha = alf( ia )
618
619 DO 50 ib = 1, nbet
620 beta = bet( ib )
621
622
623
624 transl = zero
625 CALL zmake(
'ge',
' ',
' ', 1, ml, y, 1,
626 $ yy, abs( incy ), 0, ml - 1,
627 $ reset, transl )
628
629 nc = nc + 1
630
631
632
633
634 transs = trans
635 ms = m
636 ns = n
637 kls = kl
638 kus = ku
639 als = alpha
640 DO 10 i = 1, laa
641 as( i ) = aa( i )
642 10 CONTINUE
643 ldas = lda
644 DO 20 i = 1, lx
645 xs( i ) = xx( i )
646 20 CONTINUE
647 incxs = incx
648 bls = beta
649 DO 30 i = 1, ly
650 ys( i ) = yy( i )
651 30 CONTINUE
652 incys = incy
653
654
655
656 IF( full )THEN
657 IF( trace )
658 $ WRITE( ntra, fmt = 9994 )nc, sname,
659 $ ctrans, m, n, alpha, lda, incx, beta,
660 $ incy
661 IF( rewi )
662 $ rewind ntra
663 CALL czgemv( iorder, trans, m, n,
664 $ alpha, aa, lda, xx, incx,
665 $ beta, yy, incy )
666 ELSE IF( banded )THEN
667 IF( trace )
668 $ WRITE( ntra, fmt = 9995 )nc, sname,
669 $ ctrans, m, n, kl, ku, alpha, lda,
670 $ incx, beta, incy
671 IF( rewi )
672 $ rewind ntra
673 CALL czgbmv( iorder, trans, m, n, kl,
674 $ ku, alpha, aa, lda, xx,
675 $ incx, beta, yy, incy )
676 END IF
677
678
679
680 IF( .NOT.ok )THEN
681 WRITE( nout, fmt = 9993 )
682 fatal = .true.
683 GO TO 130
684 END IF
685
686
687
688
689 isame( 1 ) = trans.EQ.transs
690 isame( 2 ) = ms.EQ.m
691 isame( 3 ) = ns.EQ.n
692 IF( full )THEN
693 isame( 4 ) = als.EQ.alpha
694 isame( 5 ) =
lze( as, aa, laa )
695 isame( 6 ) = ldas.EQ.lda
696 isame( 7 ) =
lze( xs, xx, lx )
697 isame( 8 ) = incxs.EQ.incx
698 isame( 9 ) = bls.EQ.beta
699 IF( null )THEN
700 isame( 10 ) =
lze( ys, yy, ly )
701 ELSE
702 isame( 10 ) =
lzeres(
'ge',
' ', 1,
703 $ ml, ys, yy,
704 $ abs( incy ) )
705 END IF
706 isame( 11 ) = incys.EQ.incy
707 ELSE IF( banded )THEN
708 isame( 4 ) = kls.EQ.kl
709 isame( 5 ) = kus.EQ.ku
710 isame( 6 ) = als.EQ.alpha
711 isame( 7 ) =
lze( as, aa, laa )
712 isame( 8 ) = ldas.EQ.lda
713 isame( 9 ) =
lze( xs, xx, lx )
714 isame( 10 ) = incxs.EQ.incx
715 isame( 11 ) = bls.EQ.beta
716 IF( null )THEN
717 isame( 12 ) =
lze( ys, yy, ly )
718 ELSE
719 isame( 12 ) =
lzeres(
'ge',
' ', 1,
720 $ ml, ys, yy,
721 $ abs( incy ) )
722 END IF
723 isame( 13 ) = incys.EQ.incy
724 END IF
725
726
727
728
729 same = .true.
730 DO 40 i = 1, nargs
731 same = same.AND.isame( i )
732 IF( .NOT.isame( i ) )
733 $ WRITE( nout, fmt = 9998 )i
734 40 CONTINUE
735 IF( .NOT.same )THEN
736 fatal = .true.
737 GO TO 130
738 END IF
739
740 IF( .NOT.null )THEN
741
742
743
744 CALL zmvch( trans, m, n, alpha, a,
745 $ nmax, x, incx, beta, y,
746 $ incy, yt, g, yy, eps, err,
747 $ fatal, nout, .true. )
748 errmax = max( errmax, err )
749
750
751 IF( fatal )
752 $ GO TO 130
753 ELSE
754
755
756 GO TO 110
757 END IF
758
759
760 50 CONTINUE
761
762 60 CONTINUE
763
764 70 CONTINUE
765
766 80 CONTINUE
767
768 90 CONTINUE
769
770 100 CONTINUE
771
772 110 CONTINUE
773
774 120 CONTINUE
775
776
777
778 IF( errmax.LT.thresh )THEN
779 WRITE( nout, fmt = 9999 )sname, nc
780 ELSE
781 WRITE( nout, fmt = 9997 )sname, nc, errmax
782 END IF
783 GO TO 140
784
785 130 CONTINUE
786 WRITE( nout, fmt = 9996 )sname
787 IF( full )THEN
788 WRITE( nout, fmt = 9994 )nc, sname, ctrans, m, n, alpha, lda,
789 $ incx, beta, incy
790 ELSE IF( banded )THEN
791 WRITE( nout, fmt = 9995 )nc, sname, ctrans, m, n, kl, ku,
792 $ alpha, lda, incx, beta, incy
793 END IF
794
795 140 CONTINUE
796 RETURN
797
798 9999 FORMAT(' ',a12, ' PASSED THE COMPUTATIONAL TESTS (', i6, ' CALL',
799 $ 'S)' )
800 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
801 $ 'ANGED INCORRECTLY *******' )
802 9997 FORMAT(' ',a12, ' COMPLETED THE COMPUTATIONAL TESTS (', i6, ' C',
803 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', f8.2,
804 $ ' - SUSPECT *******' )
805 9996 FORMAT( ' ******* ',a12, ' FAILED ON CALL NUMBER:' )
806 9995 FORMAT( 1x, i6, ': ',a12, '(', a14, ',', 4( i3, ',' ), '(',
807 $ f4.1, ',', f4.1, '), A,',/ 10x, i3, ', X,', i2, ',(',
808 $ f4.1, ',', f4.1, '), Y,', i2, ') .' )
809 9994 FORMAT( 1x, i6, ': ',a12, '(', a14, ',', 2( i3, ',' ), '(',
810 $ f4.1, ',', f4.1, '), A,',/ 10x, i3, ', X,', i2, ',(',
811 $ f4.1, ',', f4.1, '), Y,', i2, ') .' )
812 9993 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
813 $ '******' )
814
815
816
logical function lze(ri, rj, lr)
logical function lzeres(type, uplo, m, n, aa, as, lda)
subroutine zmvch(trans, m, n, alpha, a, nmax, x, incx, beta, y, incy, yt, g, yy, eps, err, fatal, nout, mv)
subroutine zmake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)