diff --git a/SRC/cstedc.f b/SRC/cstedc.f index 2a912cb96..bd76a9173 100644 --- a/SRC/cstedc.f +++ b/SRC/cstedc.f @@ -230,10 +230,10 @@ SUBROUTINE CSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, REAL EPS, ORGNRM, P, TINY * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL SISNAN, LSAME INTEGER ILAENV REAL SLAMCH, SLANST, SROUNDUP_LWORK - EXTERNAL ILAENV, LSAME, SLAMCH, SLANST, + EXTERNAL ILAENV, LSAME, SISNAN, SLAMCH, SLANST, $ SROUNDUP_LWORK * .. * .. External Subroutines .. @@ -395,7 +395,10 @@ SUBROUTINE CSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, IF( FINISH.LT.N ) THEN TINY = EPS*SQRT( ABS( D( FINISH ) ) )* $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN +* A NaN in D or E must not split the matrix: keep it in the +* block so that it is reported below instead of being +* dropped or isolated. + IF( .NOT.( ABS( E( FINISH ) ).LE.TINY ) ) THEN FINISH = FINISH + 1 GO TO 40 END IF @@ -409,6 +412,10 @@ SUBROUTINE CSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, * Scale. * ORGNRM = SLANST( 'M', M, D( START ), E( START ) ) + IF( SISNAN( ORGNRM ) ) THEN + INFO = START*( N+1 ) + FINISH + GO TO 70 + END IF CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), $ M, $ INFO ) diff --git a/SRC/dstedc.f b/SRC/dstedc.f index 02c3719fb..14ad9d0a4 100644 --- a/SRC/dstedc.f +++ b/SRC/dstedc.f @@ -205,10 +205,10 @@ SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, DOUBLE PRECISION EPS, ORGNRM, P, TINY * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL DISNAN, LSAME INTEGER ILAENV DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL LSAME, ILAENV, DLAMCH, DLANST + EXTERNAL DISNAN, LSAME, ILAENV, DLAMCH, DLANST * .. * .. External Subroutines .. EXTERNAL DGEMM, DLACPY, DLAED0, DLASCL, DLASET, @@ -359,7 +359,10 @@ SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, IF( FINISH.LT.N ) THEN TINY = EPS*SQRT( ABS( D( FINISH ) ) )* $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN +* A NaN in D or E must not split the matrix: keep it in the +* block so that it is reported below instead of being +* dropped or isolated. + IF( .NOT.( ABS( E( FINISH ) ).LE.TINY ) ) THEN FINISH = FINISH + 1 GO TO 20 END IF @@ -377,6 +380,10 @@ SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, * Scale. * ORGNRM = DLANST( 'M', M, D( START ), E( START ) ) + IF( DISNAN( ORGNRM ) ) THEN + INFO = START*( N+1 ) + FINISH + GO TO 50 + END IF CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), $ M, $ INFO ) diff --git a/SRC/sstedc.f b/SRC/sstedc.f index 140a51a88..bd18a3bab 100644 --- a/SRC/sstedc.f +++ b/SRC/sstedc.f @@ -205,10 +205,10 @@ SUBROUTINE SSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, REAL EPS, ORGNRM, P, TINY * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL SISNAN, LSAME INTEGER ILAENV REAL SLAMCH, SLANST, SROUNDUP_LWORK - EXTERNAL ILAENV, LSAME, SLAMCH, SLANST, + EXTERNAL ILAENV, LSAME, SISNAN, SLAMCH, SLANST, $ SROUNDUP_LWORK * .. * .. External Subroutines .. @@ -360,7 +360,10 @@ SUBROUTINE SSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, IF( FINISH.LT.N ) THEN TINY = EPS*SQRT( ABS( D( FINISH ) ) )* $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN +* A NaN in D or E must not split the matrix: keep it in the +* block so that it is reported below instead of being +* dropped or isolated. + IF( .NOT.( ABS( E( FINISH ) ).LE.TINY ) ) THEN FINISH = FINISH + 1 GO TO 20 END IF @@ -378,6 +381,10 @@ SUBROUTINE SSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, * Scale. * ORGNRM = SLANST( 'M', M, D( START ), E( START ) ) + IF( SISNAN( ORGNRM ) ) THEN + INFO = START*( N+1 ) + FINISH + GO TO 50 + END IF CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), $ M, $ INFO ) diff --git a/SRC/zstedc.f b/SRC/zstedc.f index 4a5d9fa69..e1f710a27 100644 --- a/SRC/zstedc.f +++ b/SRC/zstedc.f @@ -230,10 +230,10 @@ SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, DOUBLE PRECISION EPS, ORGNRM, P, TINY * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL DISNAN, LSAME INTEGER ILAENV DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL LSAME, ILAENV, DLAMCH, DLANST + EXTERNAL DISNAN, LSAME, ILAENV, DLAMCH, DLANST * .. * .. External Subroutines .. EXTERNAL DLASCL, DLASET, DSTEDC, DSTEQR, DSTERF, @@ -394,7 +394,10 @@ SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, IF( FINISH.LT.N ) THEN TINY = EPS*SQRT( ABS( D( FINISH ) ) )* $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN +* A NaN in D or E must not split the matrix: keep it in the +* block so that it is reported below instead of being +* dropped or isolated. + IF( .NOT.( ABS( E( FINISH ) ).LE.TINY ) ) THEN FINISH = FINISH + 1 GO TO 40 END IF @@ -408,6 +411,10 @@ SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, * Scale. * ORGNRM = DLANST( 'M', M, D( START ), E( START ) ) + IF( DISNAN( ORGNRM ) ) THEN + INFO = START*( N+1 ) + FINISH + GO TO 70 + END IF CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), $ M, $ INFO ) diff --git a/TESTING/EIG/cchkst.f b/TESTING/EIG/cchkst.f index 790c7f5f1..2f8c2415d 100644 --- a/TESTING/EIG/cchkst.f +++ b/TESTING/EIG/cchkst.f @@ -651,11 +651,16 @@ SUBROUTINE CCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP, $ ULPINV, UNFL, VL, VU * .. + CHARACTER COMPZ + INTEGER JCOMPZ, JNAN, NSMLSZ + REAL RNAN, RONE * .. Local Arrays .. INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ), $ KMAGN( MAXTYP ), KMODE( MAXTYP ), $ KTYPE( MAXTYP ) REAL DUMMA( 1 ) + REAL, ALLOCATABLE :: DREG( : ), EREG( : ) + COMPLEX, ALLOCATABLE :: ZREG( :, : ) * .. * .. External Functions .. INTEGER ILAENV @@ -1953,11 +1958,65 @@ SUBROUTINE CCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, 300 CONTINUE 310 CONTINUE * +* +* CSTEDC must report a NaN in the matrix through INFO. A NaN +* off-diagonal entry used to split the matrix and was dropped, and +* a NaN diagonal entry was isolated as a 1 by 1 block, both with +* INFO = 0, whenever the block left over was large enough for the +* divide and conquer recursion, which the sizes in the input file +* do not reach. Use local arrays because LDU is a row stride, +* not the capacity of the caller's eigenvalue arrays or Z columns. +* + NSMLSZ = ILAENV( 9, 'CSTEDC', ' ', 0, 0, 0, 0 ) + IF( ILAENV( 10, 'CSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 .AND. + $ ILAENV( 11, 'CSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 ) THEN + N = MAX( 2, NSMLSZ+1 ) + ALLOCATE( DREG( N ), EREG( N ), ZREG( N, N ) ) + RONE = ONE + RNAN = SQRT( -RONE ) + CALL CSTEDC( 'V', N, DREG, EREG, ZREG, N, WORK, -1, RWORK, -1, + $ IWORK, -1, IINFO ) + IF( IINFO.EQ.0 .AND. INT( REAL( WORK( 1 ) ) ).LE.LWORK .AND. + $ INT( RWORK( 1 ) ).LE.LRWORK .AND. IWORK( 1 ).LE.LIWORK ) + $ THEN + DO 340 JNAN = 1, 2 + DO 330 JCOMPZ = 1, 2 + IF( JCOMPZ.EQ.1 ) THEN + COMPZ = 'I' + ELSE + COMPZ = 'V' + END IF + DO 320 J = 1, N + DREG( J ) = REAL( J ) + EREG( J ) = ONE / REAL( J+1 ) + 320 CONTINUE + IF( JNAN.EQ.1 ) THEN + EREG( N / 2 ) = RNAN + ELSE + DREG( N ) = RNAN + END IF + CALL CLASET( 'Full', N, N, CZERO, CONE, ZREG, N ) + CALL CSTEDC( COMPZ, N, DREG, EREG, ZREG, N, + $ WORK, LWORK, RWORK, LRWORK, IWORK, + $ LIWORK, IINFO ) + IF( IINFO.EQ.0 ) THEN + WRITE( NOUNIT, FMT = 9985 )COMPZ, JNAN + NERRS = NERRS + 1 + END IF + NTESTT = NTESTT + 1 + 330 CONTINUE + 340 CONTINUE + END IF + DEALLOCATE( DREG, EREG, ZREG ) + END IF +* * Summary * CALL SLASUM( 'CST', NOUNIT, NERRS, NTESTT ) RETURN * + 9985 FORMAT( ' CCHKST: CSTEDC( ', A1, ' ) returned INFO=0 for a', + $ ' matrix with a NaN, case ', I1 ) 9999 FORMAT( ' CCHKST: ', A, ' returned INFO=', I6, '.', / 9X, 'N=', $ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' ) * diff --git a/TESTING/EIG/dchkst.f b/TESTING/EIG/dchkst.f index 012aa95d4..d22355112 100644 --- a/TESTING/EIG/dchkst.f +++ b/TESTING/EIG/dchkst.f @@ -634,11 +634,16 @@ SUBROUTINE DCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP, $ ULPINV, UNFL, VL, VU * .. + CHARACTER COMPZ + INTEGER JCOMPZ, JNAN, NSMLSZ + DOUBLE PRECISION RNAN, RONE * .. Local Arrays .. INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ), $ KMAGN( MAXTYP ), KMODE( MAXTYP ), $ KTYPE( MAXTYP ) DOUBLE PRECISION DUMMA( 1 ) + DOUBLE PRECISION, ALLOCATABLE :: DREG( : ), EREG( : ) + DOUBLE PRECISION, ALLOCATABLE :: ZREG( :, : ) * .. * .. External Functions .. INTEGER ILAENV @@ -1931,11 +1936,63 @@ SUBROUTINE DCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, 300 CONTINUE 310 CONTINUE * +* +* DSTEDC must report a NaN in the matrix through INFO. A NaN +* off-diagonal entry used to split the matrix and was dropped, and +* a NaN diagonal entry was isolated as a 1 by 1 block, both with +* INFO = 0, whenever the block left over was large enough for the +* divide and conquer recursion, which the sizes in the input file +* do not reach. Use local arrays because LDU is a row stride, +* not the capacity of the caller's eigenvalue arrays or Z columns. +* + NSMLSZ = ILAENV( 9, 'DSTEDC', ' ', 0, 0, 0, 0 ) + IF( ILAENV( 10, 'DSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 .AND. + $ ILAENV( 11, 'DSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 ) THEN + N = MAX( 2, NSMLSZ+1 ) + ALLOCATE( DREG( N ), EREG( N ), ZREG( N, N ) ) + RONE = ONE + RNAN = SQRT( -RONE ) + CALL DSTEDC( 'V', N, DREG, EREG, ZREG, N, WORK, -1, IWORK, -1, + $ IINFO ) + IF( IINFO.EQ.0 .AND. INT( WORK( 1 ) ).LE.LWORK .AND. + $ IWORK( 1 ).LE.LIWORK ) THEN + DO 340 JNAN = 1, 2 + DO 330 JCOMPZ = 1, 2 + IF( JCOMPZ.EQ.1 ) THEN + COMPZ = 'I' + ELSE + COMPZ = 'V' + END IF + DO 320 J = 1, N + DREG( J ) = DBLE( J ) + EREG( J ) = ONE / DBLE( J+1 ) + 320 CONTINUE + IF( JNAN.EQ.1 ) THEN + EREG( N / 2 ) = RNAN + ELSE + DREG( N ) = RNAN + END IF + CALL DLASET( 'Full', N, N, ZERO, ONE, ZREG, N ) + CALL DSTEDC( COMPZ, N, DREG, EREG, ZREG, N, + $ WORK, LWORK, IWORK, LIWORK, IINFO ) + IF( IINFO.EQ.0 ) THEN + WRITE( NOUNIT, FMT = 9985 )COMPZ, JNAN + NERRS = NERRS + 1 + END IF + NTESTT = NTESTT + 1 + 330 CONTINUE + 340 CONTINUE + END IF + DEALLOCATE( DREG, EREG, ZREG ) + END IF +* * Summary * CALL DLASUM( 'DST', NOUNIT, NERRS, NTESTT ) RETURN * + 9985 FORMAT( ' DCHKST: DSTEDC( ', A1, ' ) returned INFO=0 for a', + $ ' matrix with a NaN, case ', I1 ) 9999 FORMAT( ' DCHKST: ', A, ' returned INFO=', I6, '.', / 9X, 'N=', $ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' ) * diff --git a/TESTING/EIG/schkst.f b/TESTING/EIG/schkst.f index c5c7f57c3..7f7ced9f8 100644 --- a/TESTING/EIG/schkst.f +++ b/TESTING/EIG/schkst.f @@ -634,11 +634,16 @@ SUBROUTINE SCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP, $ ULPINV, UNFL, VL, VU * .. + CHARACTER COMPZ + INTEGER JCOMPZ, JNAN, NSMLSZ + REAL RNAN, RONE * .. Local Arrays .. INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ), $ KMAGN( MAXTYP ), KMODE( MAXTYP ), $ KTYPE( MAXTYP ) REAL DUMMA( 1 ) + REAL, ALLOCATABLE :: DREG( : ), EREG( : ) + REAL, ALLOCATABLE :: ZREG( :, : ) * .. * .. External Functions .. INTEGER ILAENV @@ -1931,11 +1936,63 @@ SUBROUTINE SCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, 300 CONTINUE 310 CONTINUE * +* +* SSTEDC must report a NaN in the matrix through INFO. A NaN +* off-diagonal entry used to split the matrix and was dropped, and +* a NaN diagonal entry was isolated as a 1 by 1 block, both with +* INFO = 0, whenever the block left over was large enough for the +* divide and conquer recursion, which the sizes in the input file +* do not reach. Use local arrays because LDU is a row stride, +* not the capacity of the caller's eigenvalue arrays or Z columns. +* + NSMLSZ = ILAENV( 9, 'SSTEDC', ' ', 0, 0, 0, 0 ) + IF( ILAENV( 10, 'SSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 .AND. + $ ILAENV( 11, 'SSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 ) THEN + N = MAX( 2, NSMLSZ+1 ) + ALLOCATE( DREG( N ), EREG( N ), ZREG( N, N ) ) + RONE = ONE + RNAN = SQRT( -RONE ) + CALL SSTEDC( 'V', N, DREG, EREG, ZREG, N, WORK, -1, IWORK, -1, + $ IINFO ) + IF( IINFO.EQ.0 .AND. INT( WORK( 1 ) ).LE.LWORK .AND. + $ IWORK( 1 ).LE.LIWORK ) THEN + DO 340 JNAN = 1, 2 + DO 330 JCOMPZ = 1, 2 + IF( JCOMPZ.EQ.1 ) THEN + COMPZ = 'I' + ELSE + COMPZ = 'V' + END IF + DO 320 J = 1, N + DREG( J ) = REAL( J ) + EREG( J ) = ONE / REAL( J+1 ) + 320 CONTINUE + IF( JNAN.EQ.1 ) THEN + EREG( N / 2 ) = RNAN + ELSE + DREG( N ) = RNAN + END IF + CALL SLASET( 'Full', N, N, ZERO, ONE, ZREG, N ) + CALL SSTEDC( COMPZ, N, DREG, EREG, ZREG, N, + $ WORK, LWORK, IWORK, LIWORK, IINFO ) + IF( IINFO.EQ.0 ) THEN + WRITE( NOUNIT, FMT = 9985 )COMPZ, JNAN + NERRS = NERRS + 1 + END IF + NTESTT = NTESTT + 1 + 330 CONTINUE + 340 CONTINUE + END IF + DEALLOCATE( DREG, EREG, ZREG ) + END IF +* * Summary * CALL SLASUM( 'SST', NOUNIT, NERRS, NTESTT ) RETURN * + 9985 FORMAT( ' SCHKST: SSTEDC( ', A1, ' ) returned INFO=0 for a', + $ ' matrix with a NaN, case ', I1 ) 9999 FORMAT( ' SCHKST: ', A, ' returned INFO=', I6, '.', / 9X, 'N=', $ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' ) * diff --git a/TESTING/EIG/zchkst.f b/TESTING/EIG/zchkst.f index 4335e15f0..8b9448455 100644 --- a/TESTING/EIG/zchkst.f +++ b/TESTING/EIG/zchkst.f @@ -651,11 +651,16 @@ SUBROUTINE ZCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP, $ ULPINV, UNFL, VL, VU * .. + CHARACTER COMPZ + INTEGER JCOMPZ, JNAN, NSMLSZ + DOUBLE PRECISION RNAN, RONE * .. Local Arrays .. INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ), $ KMAGN( MAXTYP ), KMODE( MAXTYP ), $ KTYPE( MAXTYP ) DOUBLE PRECISION DUMMA( 1 ) + DOUBLE PRECISION, ALLOCATABLE :: DREG( : ), EREG( : ) + COMPLEX*16, ALLOCATABLE :: ZREG( :, : ) * .. * .. External Functions .. INTEGER ILAENV @@ -1952,11 +1957,65 @@ SUBROUTINE ZCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, 300 CONTINUE 310 CONTINUE * +* +* ZSTEDC must report a NaN in the matrix through INFO. A NaN +* off-diagonal entry used to split the matrix and was dropped, and +* a NaN diagonal entry was isolated as a 1 by 1 block, both with +* INFO = 0, whenever the block left over was large enough for the +* divide and conquer recursion, which the sizes in the input file +* do not reach. Use local arrays because LDU is a row stride, +* not the capacity of the caller's eigenvalue arrays or Z columns. +* + NSMLSZ = ILAENV( 9, 'ZSTEDC', ' ', 0, 0, 0, 0 ) + IF( ILAENV( 10, 'ZSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 .AND. + $ ILAENV( 11, 'ZSTEDC', 'V', 1, 0, 0, 0 ).EQ.1 ) THEN + N = MAX( 2, NSMLSZ+1 ) + ALLOCATE( DREG( N ), EREG( N ), ZREG( N, N ) ) + RONE = ONE + RNAN = SQRT( -RONE ) + CALL ZSTEDC( 'V', N, DREG, EREG, ZREG, N, WORK, -1, RWORK, -1, + $ IWORK, -1, IINFO ) + IF( IINFO.EQ.0 .AND. INT( DBLE( WORK( 1 ) ) ).LE.LWORK .AND. + $ INT( RWORK( 1 ) ).LE.LRWORK .AND. IWORK( 1 ).LE.LIWORK ) + $ THEN + DO 340 JNAN = 1, 2 + DO 330 JCOMPZ = 1, 2 + IF( JCOMPZ.EQ.1 ) THEN + COMPZ = 'I' + ELSE + COMPZ = 'V' + END IF + DO 320 J = 1, N + DREG( J ) = DBLE( J ) + EREG( J ) = ONE / DBLE( J+1 ) + 320 CONTINUE + IF( JNAN.EQ.1 ) THEN + EREG( N / 2 ) = RNAN + ELSE + DREG( N ) = RNAN + END IF + CALL ZLASET( 'Full', N, N, CZERO, CONE, ZREG, N ) + CALL ZSTEDC( COMPZ, N, DREG, EREG, ZREG, N, + $ WORK, LWORK, RWORK, LRWORK, IWORK, + $ LIWORK, IINFO ) + IF( IINFO.EQ.0 ) THEN + WRITE( NOUNIT, FMT = 9985 )COMPZ, JNAN + NERRS = NERRS + 1 + END IF + NTESTT = NTESTT + 1 + 330 CONTINUE + 340 CONTINUE + END IF + DEALLOCATE( DREG, EREG, ZREG ) + END IF +* * Summary * CALL DLASUM( 'ZST', NOUNIT, NERRS, NTESTT ) RETURN * + 9985 FORMAT( ' ZCHKST: ZSTEDC( ', A1, ' ) returned INFO=0 for a', + $ ' matrix with a NaN, case ', I1 ) 9999 FORMAT( ' ZCHKST: ', A, ' returned INFO=', I6, '.', / 9X, 'N=', $ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' ) *