329 SUBROUTINE dchksb2stg( NSIZES, NN, NWDTHS, KK, NTYPES, DOTYPE,
330 $ ISEED, THRESH, NOUNIT, A, LDA, SD, SE, D1,
331 $ D2, D3, U, LDU, WORK, LWORK, RESULT, INFO )
338 INTEGER INFO, LDA, LDU, LWORK, NOUNIT, NSIZES, ,
340 DOUBLE PRECISION THRESH
344 INTEGER ISEED( 4 ), KK( * ), NN( * )
345 DOUBLE PRECISION A( LDA, * ), RESULT( * ), SD( * ), SE( * ),
346 $ d1( * ), d2( * ), d3( * ),
347 $ u( ldu, * ), work( * )
353 DOUBLE PRECISION ZERO, ONE, TWO, TEN
354 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
356 DOUBLE PRECISION HALF
357 PARAMETER ( HALF = one / two )
359 parameter( maxtyp = 15 )
362 LOGICAL BADNN, BADNNB
363 INTEGER I, IINFO, IMODE, ITYPE, J, JC, JCOL, JR, JSIZE,
364 $ jtype, jwidth, k, kmax, lh, lw, mtypes, n,
365 $ nerrs, nmats, nmax, ntest, ntestt
366 DOUBLE PRECISION ANINV, ANORM, COND, OVFL, RTOVFL, RTUNFL,
367 $ TEMP1, TEMP2, TEMP3, , ULP, ULPINV, UNFL
370 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KMAGN( MAXTYP ),
371 $ KMODE( MAXTYP ), KTYPE( MAXTYP )
374 DOUBLE PRECISION DLAMCH
382 INTRINSIC abs, dble,
max,
min, sqrt
385 DATA ktype / 1, 2, 5*4, 5*5, 3*8 /
386 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
388 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
403 nmax =
max( nmax, nn( j ) )
411 kmax =
max( kmax, kk( j ) )
415 kmax =
min( nmax-1, kmax )
419 IF( nsizes.LT.0 )
THEN
421 ELSE IF( badnn )
THEN
423 ELSE IF( nwdths.LT.0 )
THEN
425 ELSE IF( badnnb )
THEN
427 ELSE IF( ntypes.LT.0 )
THEN
429 ELSE IF( lda.LT.kmax+1 )
THEN
431 ELSE IF( ldu.LT.nmax )
THEN
433 ELSE IF( (
max( lda, nmax )+1 )*nmax.GT.lwork )
THEN
438 CALL xerbla(
'DCHKSB2STG', -info )
444 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 .OR. nwdths.EQ.0 )
449 unfl = dlamch(
'Safe minimum' )
451 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
453 rtunfl = sqrt( unfl )
454 rtovfl = sqrt( ovfl )
461 DO 190 jsize = 1, nsizes
463 aninv = one / dble(
max( 1, n ) )
465 DO 180 jwidth = 1, nwdths
469 k =
max( 0,
min( n-1, k ) )
471 IF( nsizes.NE.1 )
THEN
472 mtypes =
min( maxtyp, ntypes )
474 mtypes =
min( maxtyp+1, ntypes )
477 DO 170 jtype = 1, mtypes
478 IF( .NOT.dotype( jtype ) )
484 ioldsd( j ) = iseed( j )
504 IF( mtypes.GT.maxtyp )
508 imode = kmode( jtype )
512 GO TO ( 40, 50, 60 )kmagn( jtype )
519 anorm = ( rtovfl*ulp )*aninv
523 anorm = rtunfl*n*ulpinv
528 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
530 IF( jtype.LE.15 )
THEN
533 cond = ulpinv*aninv / ten
540 IF( itype.EQ.1 )
THEN
543 ELSE IF( itype.EQ.2 )
THEN
548 a( k+1, jcol ) = anorm
551 ELSE IF( itype.EQ.4 )
THEN
555 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
556 $ anorm, 0, 0,
'Q', a( k+1, 1 ), lda,
557 $ work( n+1 ), iinfo )
559 ELSE IF( itype.EQ.5 )
THEN
563 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
564 $ anorm, k, k,
'Q', a, lda, work( n+1 ),
567 ELSE IF( itype.EQ.7 )
THEN
571 CALL dlatmr( n, n, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
572 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
573 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, 0, 0,
574 $ ZERO, ANORM, 'q
', A( K+1, 1 ), LDA,
577.EQ.
ELSE IF( ITYPE8 ) THEN
581 CALL DLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
582 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
583 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, K, K,
584 $ ZERO, ANORM, 'q
', A, LDA, IDUMMA, IINFO )
586.EQ.
ELSE IF( ITYPE9 ) THEN
590 CALL DLATMS( N, N, 's
', ISEED, 'p
', WORK, IMODE, COND,
591 $ ANORM, K, K, 'q
', A, LDA, WORK( N+1 ),
594.EQ.
ELSE IF( ITYPE10 ) THEN
600 CALL DLATMS( N, N, 's
', ISEED, 'p
', WORK, IMODE, COND,
601 $ ANORM, 1, 1, 'q
', A( K, 1 ), LDA,
602 $ WORK( N+1 ), IINFO )
604 TEMP1 = ABS( A( K, I ) ) /
605 $ SQRT( ABS( A( K+1, I-1 )*A( K+1, I ) ) )
606.GT.
IF( TEMP1HALF ) THEN
607 A( K, I ) = HALF*SQRT( ABS( A( K+1,
608 $ I-1 )*A( K+1, I ) ) )
617.NE.
IF( IINFO0 ) THEN
618 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N,
628 CALL DLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
631 CALL DSBTRD( 'v
', 'u
', N, K, WORK, LDA, SD, SE, U, LDU,
632 $ WORK( LDA*N+1 ), IINFO )
634.NE.
IF( IINFO0 ) THEN
635 WRITE( NOUNIT, FMT = 9999 )'dsbtrd(u)
', IINFO, N,
638.LT.
IF( IINFO0 ) THEN
648 CALL DSBT21( 'upper
', N, K, 1, A, LDA, SD, SE, U, LDU,
649 $ WORK, RESULT( 1 ) )
663 CALL DCOPY( N, SD, 1, D1, 1 )
665 $ CALL DCOPY( N-1, SE, 1, WORK, 1 )
667 CALL DSTEQR( 'n', n, d1, work, work( n+1 ), ldu,
668 $ work( n+1 ), iinfo )
669 IF( iinfo.NE.0 )
THEN
670 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n,
673 IF( iinfo.LT.0 )
THEN
686 CALL dlaset( 'full
', N, 1, ZERO, ZERO, SD, N )
687 CALL DLASET( 'full
', N, 1, ZERO, ZERO, SE, N )
688 CALL DLACPY( ' ', K+1, N, A, LDA, U, LDU )
691 CALL DSYTRD_SB2ST( 'n
', 'n
', "U", N, K, U, LDU, SD, SE,
692 $ WORK, LH, WORK( LH+1 ), LW, IINFO )
696 CALL DCOPY( N, SD, 1, D2, 1 )
698 $ CALL DCOPY( N-1, SE, 1, WORK, 1 )
700 CALL DSTEQR( 'n
', N, D2, WORK, WORK( N+1 ), LDU,
701 $ WORK( N+1 ), IINFO )
702.NE.
IF( IINFO0 ) THEN
703 WRITE( NOUNIT, FMT = 9999 )'dsteqr(n)
', IINFO, N,
706.LT.
IF( IINFO0 ) THEN
718 DO 110 JR = 0, MIN( K, N-JC )
719 A( JR+1, JC ) = A( K+1-JR, JC+JR )
722 DO 140 JC = N + 1 - K, N
723 DO 130 JR = MIN( K, N-JC ) + 1, K
730 CALL DLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
733 CALL DSBTRD( 'v
', 'l
', N, K, WORK, LDA, SD, SE, U, LDU,
734 $ WORK( LDA*N+1 ), IINFO )
736.NE.
IF( IINFO0 ) THEN
737 WRITE( NOUNIT, FMT = 9999 )'dsbtrd(l)
', IINFO, N,
740.LT.
IF( IINFO0 ) THEN
751 CALL DSBT21( 'lower
', N, K, 1, A, LDA, SD, SE, U, LDU,
752 $ WORK, RESULT( 3 ) )
759 CALL DLASET( 'full
', N, 1, ZERO, ZERO, SD, N )
760 CALL DLASET( 'full
', N, 1, ZERO, ZERO, SE, N )
761 CALL DLACPY( ' ', K+1, N, A, LDA, U, LDU )
764 CALL DSYTRD_SB2ST( 'n
', 'n
', "L", N, K, U, LDU, SD, SE,
765 $ WORK, LH, WORK( LH+1 ), LW, IINFO )
769 CALL DCOPY( N, SD, 1, D3, 1 )
771 $ CALL DCOPY( N-1, SE, 1, WORK, 1 )
773 CALL DSTEQR( 'n
', N, D3, WORK, WORK( N+1 ), LDU,
774 $ WORK( N+1 ), IINFO )
775.NE.
IF( IINFO0 ) THEN
776 WRITE( NOUNIT, FMT = 9999 )'dsteqr(n)
', IINFO, N,
779.LT.
IF( IINFO0 ) THEN
798 TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
799 TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
800 TEMP3 = MAX( TEMP3, ABS( D1( J ) ), ABS( D3( J ) ) )
801 TEMP4 = MAX( TEMP4, ABS( D1( J )-D3( J ) ) )
804 RESULT(5) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
805 RESULT(6) = TEMP4 / MAX( UNFL, ULP*MAX( TEMP3, TEMP4 ) )
810 NTESTT = NTESTT + NTEST
815.GE.
IF( RESULT( JR )THRESH ) THEN
820.EQ.
IF( NERRS0 ) THEN
821 WRITE( NOUNIT, FMT = 9998 )'dsb
'
822 WRITE( NOUNIT, FMT = 9997 )
823 WRITE( NOUNIT, FMT = 9996 )
824 WRITE( NOUNIT, FMT = 9995 )'symmetric
'
825 WRITE( NOUNIT, FMT = 9994 )'orthogonal
', '''',
826 $ 'transpose
', ( '''', J = 1, 6 )
829 WRITE( NOUNIT, FMT = 9993 )N, K, IOLDSD, JTYPE,
840 CALL DLASUM( 'dsb
', NOUNIT, NERRS, NTESTT )
843 9999 FORMAT( ' dchksb2stg:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
844 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
846 9998 FORMAT( / 1X, A3,
847 $ ' -- real symmetric banded tridiagonal reduction routines
' )
850 9996 FORMAT( / ' special matrices:
',
851 $ / ' 1=zero matrix.
',
852 $ ' 5=diagonal: clustered entries.
',
853 $ / ' 2=identity matrix.
',
854 $ ' 6=diagonal: large, evenly spaced.
',
855 $ / ' 3=diagonal: evenly spaced entries.
',
856 $ ' 7=diagonal: small, evenly spaced.
',
857 $ / ' 4=diagonal: geometr. spaced entries.
' )
858 9995 FORMAT( ' dense
', A, ' banded matrices:
',
859 $ / ' 8=evenly spaced eigenvals. ',
860 $
' 12=Small, evenly spaced eigenvals.',
861 $ /
' 9=Geometrically spaced eigenvals. ',
862 $
' 13=Matrix with random O(1) entries.',
863 $ /
' 10=Clustered eigenvalues. ',
864 $
' 14=Matrix with large random entries.',
865 $ /
' 11=Large, evenly spaced eigenvals. ',
866 $
' 15=Matrix with small random entries.' )
868 9994
FORMAT( /
' Tests performed: (S is Tridiag, U is ', a,
',',
869 $ / 20x, a,
' means ', a,
'.', /
' UPLO=''U'':',
870 $ /
' 1= | A - U S U', a1,
' | / ( |A| n ulp ) ',
871 $
' 2= | I - U U', a1,
' | / ( n ulp )', /
' UPLO=''L'':',
872 $ /
' 3= | A - U S U', a1,
' | / ( |A| n ulp ) ',
873 $
' 4= | I - U U', a1,
' | / ( n ulp )' /
' Eig check:',
874 $ /
' 5= | D1 - D2',
'',
' | / ( |D1| ulp ) ',
875 $
' 6= | D1 - D3',
'',
' | / ( |D1| ulp ) ' )
876 9993
FORMAT(
' N=', i5,
', K=', i4,
', seed=', 4( i4,
',' ),
' type ',
877 $ i2,
', test(', i2,
')=', g10.3 )
subroutine dsytrd_sb2st(stage1, vect, uplo, n, kd, ab, ldab, d, e, hous, lhous, work, lwork, info)
DSYTRD_SB2ST reduces a real symmetric band matrix A to real symmetric tridiagonal form T
subroutine dchksb2stg(nsizes, nn, nwdths, kk, ntypes, dotype, iseed, thresh, nounit, a, lda, sd, se, d1, d2, d3, u, ldu, work, lwork, result, info)
DCHKSB2STG
subroutine dlatmr(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)
DLATMR