139 SUBROUTINE dbdt01( M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK,
147 INTEGER KD, LDA, LDPT, LDQ, , N
148 DOUBLE PRECISION RESID
151 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), PT( , * ),
152 $ q( ldq, * ), work( * )
158 DOUBLE PRECISION , ONE
159 parameter( zero = 0.0d+0, one = 1.0d+0 )
163 DOUBLE PRECISION ANORM, EPS
166 DOUBLE PRECISION DASUM, DLAMCH, DLANGE
167 EXTERNAL dasum, dlamch, dlange
179 IF( m.LE.0 .OR. n.LE.0 )
THEN
191 IF( kd.NE.0 .AND. m.GE.n )
THEN
196 CALL dcopy( m, a( 1, j ), 1, work, 1 )
198 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
200 work( m+n ) = d( n )*pt( n, j )
201 CALL dgemv( 'no transpose
', M, N, -ONE, Q, LDQ,
202 $ WORK( M+1 ), 1, ONE, WORK, 1 )
203 RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
205.LT.
ELSE IF( KD0 ) THEN
210 CALL DCOPY( M, A( 1, J ), 1, WORK, 1 )
212 WORK( M+I ) = D( I )*PT( I, J ) + E( I )*PT( I+1, J )
214 WORK( M+M ) = D( M )*PT( M, J )
215 CALL DGEMV( 'no transpose
', M, M, -ONE, Q, LDQ,
216 $ WORK( M+1 ), 1, ONE, WORK, 1 )
217 RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
224 CALL DCOPY( M, A( 1, J ), 1, WORK, 1 )
225 WORK( M+1 ) = D( 1 )*PT( 1, J )
227 WORK( M+I ) = E( I-1 )*PT( I-1, J ) +
230 CALL DGEMV( 'no transpose
', M, M, -ONE, Q, LDQ,
231 $ WORK( M+1 ), 1, ONE, WORK, 1 )
232 RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
241 CALL DCOPY( M, A( 1, J ), 1, WORK, 1 )
243 WORK( M+I ) = D( I )*PT( I, J )
245 CALL DGEMV( 'no transpose
', M, N, -ONE, Q, LDQ,
246 $ WORK( M+1 ), 1, ONE, WORK, 1 )
247 RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
251 CALL DCOPY( M, A( 1, J ), 1, WORK, 1 )
253 WORK( M+I ) = D( I )*PT( I, J )
255 CALL DGEMV( 'no transpose
', M, M, -ONE, Q, LDQ,
256 $ WORK( M+1 ), 1, ONE, WORK, 1 )
257 RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
264 ANORM = DLANGE( '1
', M, N, A, LDA, WORK )
265 EPS = DLAMCH( 'precision
' )
267.LE.
IF( ANORMZERO ) THEN
271.GE.
IF( ANORMRESID ) THEN
272 RESID = ( RESID / ANORM ) / ( DBLE( N )*EPS )
274.LT.
IF( ANORMONE ) THEN
275 RESID = ( MIN( RESID, DBLE( N )*ANORM ) / ANORM ) /
278 RESID = MIN( RESID / ANORM, DBLE( N ) ) /
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dbdt01(m, n, kd, a, lda, q, ldq, d, e, pt, ldpt, work, resid)
DBDT01