162 SUBROUTINE zunt03( RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK,
163 $ RWORK, RESULT, INFO )
172 INTEGER INFO, K, LDU, LDV, LWORK, MU, MV, N
173 DOUBLE PRECISION RESULT
176 DOUBLE PRECISION RWORK( * )
177 COMPLEX*16 U( ldu, * ), V( ldv, * ), WORK( * )
184 DOUBLE PRECISION ZERO, ONE
185 parameter( zero = 0.0d0, one = 1.0d0 )
188 INTEGER I, IRC, J, LMX
189 DOUBLE PRECISION RES1, RES2, ULP
195 DOUBLE PRECISION DLAMCH
196 EXTERNAL lsame, izamax, dlamch
199 INTRINSIC abs, dble, dcmplx, max, min
209 IF( lsame( rc,
'R' ) )
THEN 211 ELSE IF( lsame( rc,
'C' ) )
THEN 218 ELSE IF( mu.LT.0 )
THEN 220 ELSE IF( mv.LT.0 )
THEN 222 ELSE IF( n.LT.0 )
THEN 224 ELSE IF( k.LT.0 .OR. k.GT.max( mu, mv ) )
THEN 226 ELSE IF( ( irc.EQ.0 .AND. ldu.LT.max( 1, mu ) ) .OR.
227 $ ( irc.EQ.1 .AND. ldu.LT.max( 1, n ) ) )
THEN 229 ELSE IF( ( irc.EQ.0 .AND. ldv.LT.max( 1, mv ) ) .OR.
230 $ ( irc.EQ.1 .AND. ldv.LT.max( 1, n ) ) )
THEN 234 CALL xerbla(
'ZUNT03', -info )
241 IF( mu.EQ.0 .OR. mv.EQ.0 .OR. n.EQ.0 )
246 ulp = dlamch(
'Precision' )
254 lmx = izamax( n, u( i, 1 ), ldu )
255 IF( v( i, lmx ).EQ.dcmplx( zero ) )
THEN 258 sv = abs( v( i, lmx ) ) / v( i, lmx )
260 IF( u( i, lmx ).EQ.dcmplx( zero ) )
THEN 263 su = abs( u( i, lmx ) ) / u( i, lmx )
267 res1 = max( res1, abs( u( i, j )-s*v( i, j ) ) )
270 res1 = res1 / ( dble( n )*ulp )
274 CALL zunt01(
'Rows', mv, n, v, ldv, work, lwork, rwork, res2 )
282 lmx = izamax( n, u( 1, i ), 1 )
283 IF( v( lmx, i ).EQ.dcmplx( zero ) )
THEN 286 sv = abs( v( lmx, i ) ) / v( lmx, i )
288 IF( u( lmx, i ).EQ.dcmplx( zero ) )
THEN 291 su = abs( u( lmx, i ) ) / u( lmx, i )
295 res1 = max( res1, abs( u( j, i )-s*v( j, i ) ) )
298 res1 = res1 / ( dble( n )*ulp )
302 CALL zunt01(
'Columns', n, mv, v, ldv, work, lwork, rwork,
306 result = min( max( res1, res2 ), one / ulp )
subroutine zunt03(RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK, RWORK, RESULT, INFO)
ZUNT03
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zunt01(ROWCOL, M, N, U, LDU, WORK, LWORK, RWORK, RESID)
ZUNT01