155 SUBROUTINE zget51( ITYPE, N, A, LDA, B, LDB, U, LDU, V, LDV, WORK,
164 INTEGER ITYPE, LDA, LDB, LDU, LDV, N
165 DOUBLE PRECISION RESULT
168 DOUBLE PRECISION RWORK( * )
169 COMPLEX*16 A( LDA, * ), B( LDB, * ), U( LDU, * ),
170 $ v( ldv, * ), work( * )
176 DOUBLE PRECISION ZERO, ONE, TEN
177 parameter( zero = 0.0d+0, one = 1.0d+0, ten = 10.0d+0 )
178 COMPLEX*16 CZERO, CONE
179 parameter( czero = ( 0.0d+0, 0.0d+0 ),
180 $ cone = ( 1.0d+0, 0.0d+0 ) )
183 INTEGER JCOL, JDIAG, JROW
184 DOUBLE PRECISION ANORM, ULP, UNFL, WNORM
187 DOUBLE PRECISION DLAMCH, ZLANGE
188 EXTERNAL dlamch, zlange
194 INTRINSIC dble, max, min
204 unfl = dlamch(
'Safe minimum' )
205 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
209 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
214 IF( itype.LE.2 )
THEN
218 anorm = max( zlange(
'1', n, n, a, lda, rwork ), unfl )
220 IF( itype.EQ.1 )
THEN
224 CALL zlacpy(
' ', n, n, a, lda, work, n )
225 CALL zgemm(
'N',
'N', n, n, n, cone, u, ldu, b, ldb, czero,
226 $ work( n**2+1 ), n )
228 CALL zgemm(
'N',
'C', n, n, n, -cone, work( n**2+1 ), n, v,
229 $ ldv, cone, work, n )
235 CALL zlacpy(
' ', n, n, b, ldb, work, n )
239 work( jrow+n*( jcol-1 ) ) = work( jrow+n*( jcol-1 ) )
247 wnorm = zlange(
'1', n, n, work, n, rwork )
249 IF( anorm.GT.wnorm )
THEN
250 result = ( wnorm / anorm ) / ( n*ulp )
252 IF( anorm.LT.one )
THEN
253 result = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
255 result = min( wnorm / anorm, dble( n ) ) / ( n*ulp )
265 CALL zgemm(
'N',
'C', n, n, n, cone, u, ldu, u, ldu, czero,
269 work( ( n+1 )*( jdiag-1 )+1 ) = work( ( n+1 )*( jdiag-1 )+
273 result = min( zlange(
'1', n, n, work, n, rwork ),
274 $ dble( n ) ) / ( n*ulp )