137 SUBROUTINE dstt22( N, M, KBAND, AD, AE, SD, SE, U, LDU, WORK,
145 INTEGER KBAND, LDU, LDWORK, M, N
148 DOUBLE PRECISION AD( * ), AE( * ), ( 2 ), SD( * ),
149 $ se( * ), u( ldu, * ), work( ldwork, * )
155 DOUBLE PRECISION ZERO, ONE
156 parameter( zero = 0.0d0, one = 1.0d0 )
160 DOUBLE PRECISION ANORM, AUKJ, ULP, UNFL, WNORM
163 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
164 EXTERNAL dlamch, dlange, dlansy
170 INTRINSIC abs, dble,
max,
min
176 IF( n.LE.0 .OR. m.LE.0 )
179 unfl = dlamch(
'Safe minimum' )
180 ulp = dlamch( 'epsilon
' )
187 ANORM = ABS( AD( 1 ) ) + ABS( AE( 1 ) )
189 ANORM = MAX( ANORM, ABS( AD( J ) )+ABS( AE( J ) )+
192 ANORM = MAX( ANORM, ABS( AD( N ) )+ABS( AE( N-1 ) ) )
194 ANORM = ABS( AD( 1 ) )
196 ANORM = MAX( ANORM, UNFL )
204 AUKJ = AD( K )*U( K, J )
206 $ AUKJ = AUKJ + AE( K )*U( K+1, J )
208 $ AUKJ = AUKJ + AE( K-1 )*U( K-1, J )
209 WORK( I, J ) = WORK( I, J ) + U( K, I )*AUKJ
212 WORK( I, I ) = WORK( I, I ) - SD( I )
213.EQ.
IF( KBAND1 ) THEN
215 $ WORK( I, I-1 ) = WORK( I, I-1 ) - SE( I-1 )
217 $ WORK( I, I+1 ) = WORK( I, I+1 ) - SE( I )
221 WNORM = DLANSY( '1
', 'l
', M, WORK, M, WORK( 1, M+1 ) )
223.GT.
IF( ANORMWNORM ) THEN
224 RESULT( 1 ) = ( WNORM / ANORM ) / ( M*ULP )
226.LT.
IF( ANORMONE ) THEN
227 RESULT( 1 ) = ( MIN( WNORM, M*ANORM ) / ANORM ) / ( M*ULP )
229 RESULT( 1 ) = MIN( WNORM / ANORM, DBLE( M ) ) / ( M*ULP )
237 CALL DGEMM( 't
', 'n
', M, M, N, ONE, U, LDU, U, LDU, ZERO, WORK,
241 WORK( J, J ) = WORK( J, J ) - ONE
244 RESULT( 2 ) = MIN( DBLE( M ), DLANGE( '1
', M, M, WORK, M, WORK( 1,
245 $ M+1 ) ) ) / ( M*ULP )
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dstt22(n, m, kband, ad, ae, sd, se, u, ldu, work, ldwork, result)
DSTT22