337 SUBROUTINE cchkhb2stg( NSIZES, NN, NWDTHS, KK, NTYPES, DOTYPE,
338 $ ISEED, THRESH, NOUNIT, A, LDA, SD, SE, D1,
339 $ D2, D3, U, LDU, WORK, LWORK, RWORK, RESULT,
347 INTEGER INFO, LDA, LDU, LWORK, NOUNIT, NSIZES, NTYPES,
353 INTEGER ISEED( 4 ), KK( * ), NN( * )
354 REAL RESULT( * ), RWORK( * ), SD( * ), SE( * ),
355 $ d1( * ), d2( * ), d3( * )
356 COMPLEX A( LDA, * ), U( LDU, * ), WORK( * )
363 PARAMETER ( CZERO = ( 0.0e+0, 0.0e+0 ),
364 $ cone = ( 1.0e+0, 0.0e+0 ) )
365 REAL ZERO, , TWO, TEN
366 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0,
369 parameter( half = one / two )
371 parameter( maxtyp = 15 )
374 LOGICAL BADNN, BADNNB
375 INTEGER I, IINFO, IMODE, ITYPE, J, JC, JCOL, JR, JSIZE,
376 $ , JWIDTH, , KMAX, LH, LW, MTYPES, N,
377 $ nerrs, nmats, nmax, ntest, ntestt
378 REAL ANINV, , COND, OVFL, , RTUNFL,
379 $ TEMP1, TEMP2, TEMP3,
382 INTEGER IDUMMA( 1 ), ( 4 ), KMAGN( MAXTYP ),
383 $ KMODE( ), KTYPE( MAXTYP )
394 INTRINSIC abs, real, conjg,
max,
min, sqrt
397 DATA ktype / 1, 2, 5*4, 5*5, 3*8 /
398 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
400 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
415 nmax =
max( nmax, nn( j ) )
423 kmax =
max( kmax, kk( j ) )
427 kmax =
min( nmax-1, kmax )
431 IF( nsizes.LT.0 )
THEN
433 ELSE IF( badnn )
THEN
435 ELSE IF( nwdths.LT.0 )
THEN
437 ELSE IF( badnnb )
THEN
439 ELSE IF( ntypes.LT.0 )
THEN
441 ELSE IF( lda.LT.kmax+1 )
THEN
443 ELSE IF( ldu.LT.nmax )
THEN
445 ELSE IF( (
max( lda, nmax )+1 )*nmax.GT.lwork )
THEN
450 CALL xerbla(
'CCHKHB2STG', -info )
456 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 .OR. nwdths.EQ.0 )
461 unfl = slamch(
'Safe minimum' )
463 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
465 rtunfl = sqrt( unfl )
466 rtovfl = sqrt( ovfl )
473 DO 190 jsize = 1, nsizes
475 aninv = one / real(
max( 1, n ) )
477 DO 180 jwidth = 1, nwdths
481 k =
max( 0,
min( n-1, k ) )
483 IF( nsizes.NE.1 )
THEN
484 mtypes =
min( maxtyp, ntypes )
486 mtypes =
min( maxtyp+1, ntypes )
489 DO 170 jtype = 1, mtypes
490 IF( .NOT.dotype( jtype ) )
496 ioldsd( j ) = iseed( j )
516 IF( mtypes.GT.maxtyp )
519 itype = ktype( jtype )
520 imode = kmode( jtype )
524 GO TO ( 40, 50, 60 )kmagn( jtype )
531 anorm = ( rtovfl*ulp )*aninv
535 anorm = rtunfl*n*ulpinv
540 CALL claset(
'Full', lda, n, czero, czero, a, lda )
542 IF( jtype.LE.15 )
THEN
545 cond = ulpinv*aninv / ten
552 IF( itype.EQ.1 )
THEN
555 ELSE IF( itype.EQ.2 )
THEN
560 a( k+1, jcol ) = anorm
563 ELSE IF( itype.EQ.4 )
THEN
567 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode,
568 $
'Q', a( k+1, 1 ), lda,
571 ELSE IF( itype.EQ.5 )
THEN
575 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode,
576 $ cond, anorm, k, k,
'Q', a, lda, work,
579 ELSE IF( itype.EQ.7 )
THEN
583 CALL clatmr( n, n,
'S', iseed,
'H', work, 6, one,
584 $ cone,
'T',
'N', work( n+1 ), 1, one,
585 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
586 $ zero, anorm,
'Q', a( k+1, 1 ), lda,
589 ELSE IF( itype.EQ.8 )
THEN
593 CALL clatmr( n, n,
'S', iseed,
'H', work, 6, one,
594 $ cone,
'T', 'n
', WORK( N+1 ), 1, ONE,
595 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, K, K,
596 $ ZERO, ANORM, 'q
', A, LDA, IDUMMA, IINFO )
598.EQ.
ELSE IF( ITYPE9 ) THEN
602 CALL CLATMS( N, N, 's
', ISEED, 'p
', RWORK, IMODE,
603 $ COND, ANORM, K, K, 'q
', A, LDA,
604 $ WORK( N+1 ), IINFO )
606.EQ.
ELSE IF( ITYPE10 ) THEN
612 CALL CLATMS( N, N, 's
', ISEED, 'p
', RWORK, IMODE,
613 $ COND, ANORM, 1, 1, 'q
', A( K, 1 ), LDA,
616 TEMP1 = ABS( A( K, I ) ) /
617 $ SQRT( ABS( A( K+1, I-1 )*A( K+1, I ) ) )
618.GT.
IF( TEMP1HALF ) THEN
619 A( K, I ) = HALF*SQRT( ABS( A( K+1,
620 $ I-1 )*A( K+1, I ) ) )
629.NE.
IF( IINFO0 ) THEN
630 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N,
640 CALL CLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
643 CALL CHBTRD( 'v
', 'u
', N, K, WORK, LDA, SD, SE, U, LDU,
644 $ WORK( LDA*N+1 ), IINFO )
646.NE.
IF( IINFO0 ) THEN
647 WRITE( NOUNIT, FMT = 9999 )'chbtrd(u)
', IINFO, N,
650.LT.
IF( IINFO0 ) THEN
660 CALL CHBT21( 'upper
', N, K, 1, A, LDA, SD, SE, U, LDU,
661 $ WORK, RWORK, RESULT( 1 ) )
675 CALL SCOPY( N, SD, 1, D1, 1 )
677 $ CALL SCOPY( N-1, SE, 1, RWORK, 1 )
679 CALL CSTEQR( 'n
', N, D1, RWORK, WORK, LDU,
680 $ RWORK( N+1 ), IINFO )
681.NE.
IF( IINFO0 ) THEN
682 WRITE( NOUNIT, FMT = 9999 )'csteqr(n)
', IINFO, N,
685.LT.
IF( IINFO0 ) THEN
698 CALL SLASET( 'full
', N, 1, ZERO, ZERO, SD, N )
699 CALL SLASET( 'full
', N, 1, ZERO, ZERO, SE, N )
700 CALL CLACPY( ' ', K+1, N, A, LDA, U, LDU )
703 CALL CHETRD_HB2ST( 'n
', 'n',
"U", n, k, u, ldu, sd, se,
704 $ work, lh, work( lh+1 ), lw, iinfo )
708 CALL scopy( n, sd, 1, d2, 1 )
710 $
CALL scopy( n-1, se, 1, rwork, 1 )
712 CALL csteqr(
'N', n, d2, rwork, work, ldu,
713 $ rwork( n+1 ), iinfo )
714 IF( iinfo.NE.0 )
THEN
715 WRITE( nounit, fmt = 9999 )'
csteqr(n)
', IINFO, N,
718.LT.
IF( IINFO0 ) THEN
730 DO 110 JR = 0, MIN( K, N-JC )
731 A( JR+1, JC ) = CONJG( A( K+1-JR, JC+JR ) )
734 DO 140 JC = N + 1 - K, N
735 DO 130 JR = MIN( K, N-JC ) + 1, K
742 CALL CLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
745 CALL CHBTRD( 'v
', 'l
', N, K, WORK, LDA, SD, SE, U, LDU,
746 $ WORK( LDA*N+1 ), IINFO )
748.NE.
IF( IINFO0 ) THEN
749 WRITE( NOUNIT, FMT = 9999 )'chbtrd(l)', iinfo, n,
752 IF( iinfo.LT.0 )
THEN
763 CALL chbt21(
'Lower', n, k, 1, a, lda, sd, se, u, ldu,
764 $ work, rwork, result( 3 ) )
771 CALL slaset(
'Full', n, 1, zero, zero, sd, n )
772 CALL slaset(
'Full', n, 1, zero, zero, se, n )
773 CALL clacpy(
' ', k+1, n, a, lda, u, ldu )
777 $ work, lh, work( lh+1 ), lw, iinfo )
781 CALL scopy( n, sd, 1, d3, 1 )
783 $
CALL scopy( n-1, se, 1, rwork, 1 )
785 CALL csteqr(
'N', n, d3, rwork, work, ldu,
786 $ rwork( n+1 ), iinfo )
787 IF( iinfo.NE.0 )
THEN
788 WRITE( nounit, fmt = 9999 )
'CSTEQR(N)', iinfo, n,
791 IF( iinfo.LT.0 )
THEN
810 temp1 =
max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
811 temp2 =
max( temp2, abs( d1( j )-d2( j ) ) )
812 temp3 =
max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
813 temp4 =
max( temp4, abs( d1( j )-d3( j ) ) )
816 result(5) = temp2 /
max( unfl, ulp*
max( temp1, temp2 ) )
817 result(6) = temp4 /
max( unfl, ulp*
max( temp3, temp4 ) )
822 ntestt = ntestt + ntest
827 IF( result( jr ).GE.thresh )
THEN
832 IF( nerrs.EQ.0 )
THEN
833 WRITE( nounit, fmt = 9998 )
'CHB'
834 WRITE( nounit, fmt = 9997 )
835 WRITE( nounit, fmt = 9996 )
836 WRITE( nounit, fmt = 9995 )
'Hermitian'
837 WRITE( nounit, fmt = 9994 )
'unitary',
'*',
838 $ 'conjugate transpose
', ( '*
', J = 1, 6 )
841 WRITE( NOUNIT, FMT = 9993 )N, K, IOLDSD, JTYPE,
852 CALL SLASUM( 'chb
', NOUNIT, NERRS, NTESTT )
855 9999 FORMAT( ' cchkhb2stg:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
856 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
857 9998 FORMAT( / 1X, A3,
858 $ ' --
Complex Hermitian Banded Tridiagonal Reduction Routines
'
860 9997 FORMAT( ' Matrix types (see SCHK23 for details):
' )
862 9996 FORMAT( / ' Special Matrices:
',
863 $ / ' 1=zero matrix.
',
864 $ ' 5=diagonal: clustered entries.
',
865 $ / ' 2=identity matrix.
',
866 $ ' 6=diagonal: large, evenly spaced.
',
867 $ / ' 3=diagonal: evenly spaced entries.
',
868 $ ' 7=diagonal: small, evenly spaced.
',
869 $ / ' 4=diagonal: geometr. spaced entries.
' )
870 9995 FORMAT( ' dense
', A, ' banded matrices:
',
871 $ / ' 8=evenly spaced eigenvals.
',
872 $ ' 12=small, evenly spaced eigenvals.
',
873 $ / ' 9=geometrically spaced eigenvals.
',
874 $ ' 13=matrix with random o(1) entries.
',
875 $ / ' 10=clustered eigenvalues.
',
876 $ ' 14=matrix with large random entries.',
877 $ /
' 11=Large, evenly spaced eigenvals. ',
878 $
' 15=Matrix with small random entries.' )
880 9994
FORMAT( /
' Tests performed: (S is Tridiag, U is ', a,
',',
881 $ / 20x, a,
' means ', a,
'.', /
' UPLO=''U'':',
882 $ /
' 1= | A - U S U', a1,
' | / ( |A| n ulp ) ',
883 $
' 2= | I - U U', a1,
' | / ( n ulp )', /
' UPLO=''L'':',
884 $ /
' 3= | A - U S U', a1,
' | / ( |A| n ulp ) ',
885 $
' 4= | I - U U', a1,
' | / ( n ulp )' /
' Eig check:',
886 $ /
' 5= | D1 - D2',
'',
' | / ( |D1| ulp ) ',
887 $
' 6= | D1 - D3',
'',
' | / ( |D1| ulp ) ' )
888 9993
FORMAT(
' N=', i5,
', K=', i4,
', seed=', 4( i4,
',' ),
' type ',
889 $ i2,
', test(', i2,
')=', g10.3 )
subroutine clatmr(m, n, dist, iseed, sym, d, mode, cond, dmax, rsign, grade, dl, model, condl, dr, moder, condr, pivtng, ipivot, kl, ku, sparse, anorm, pack, a, lda, iwork, info)
CLATMR