123 SUBROUTINE zbdt05( M, N, A, LDA, S, NS, U, LDU,
124 $ VT, LDVT, WORK, RESID )
131 INTEGER LDA, LDU, LDVT, M, N, NS
132 DOUBLE PRECISION RESID
135 DOUBLE PRECISION S( * )
136 COMPLEX*16 A( LDA, * ), U( * ), VT( LDVT, * ), WORK( * )
142 DOUBLE PRECISION ZERO, ONE
143 parameter( zero = 0.0d+0, one = 1.0d+0 )
144 COMPLEX*16 CZERO, CONE
145 parameter( czero = ( 0.0d+0, 0.0d+0 ),
146 $ cone = ( 1.0d+0, 0.0d+0 ) )
150 DOUBLE PRECISION ANORM, EPS
153 DOUBLE PRECISION DUM( 1 )
158 DOUBLE PRECISION DASUM, DLAMCH, ZLANGE
159 EXTERNAL lsame, idamax, dasum, dlamch, zlange
160 DOUBLE PRECISION DZASUM
166 INTRINSIC abs, dble, max, min
173 IF( min( m, n ).LE.0 .OR. ns.LE.0 )
176 eps = dlamch(
'Precision' )
177 anorm = zlange(
'M', m, n, a, lda, dum )
181 CALL zgemm(
'N',
'C', m, ns, n, cone, a, lda, vt,
182 $ ldvt, czero, work( 1+ns*ns ), m )
183 CALL zgemm(
'C',
'N', ns, ns, m, -cone, u, ldu, work( 1+ns*ns ),
184 $ m, czero, work, ns )
190 work( j+i ) = work( j+i ) + dcmplx( s( i ), zero )
191 resid = max( resid, dzasum( ns, work( j+1 ), 1 ) )
195 IF( anorm.LE.zero )
THEN
199 IF( anorm.GE.resid )
THEN
200 resid = ( resid / anorm ) / ( dble( n )*eps )
202 IF( anorm.LT.one )
THEN
203 resid = ( min( resid, dble( n )*anorm ) / anorm ) /
206 resid = min( resid / anorm, dble( n ) ) /
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zbdt05(M, N, A, LDA, S, NS, U, LDU, VT, LDVT, WORK, RESID)
ZBDT05