154 SUBROUTINE sort03( RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK,
163 INTEGER INFO, K, LDU, LDV, LWORK, MU, MV, N
167 REAL U( LDU, * ), V( LDV, * ), WORK( * )
174 parameter( zero = 0.0e0, one = 1.0e0 )
177 INTEGER I, IRC, J, LMX
178 REAL RES1, RES2, S, ULP
184 EXTERNAL lsame, isamax, slamch
187 INTRINSIC abs,
max,
min, real, sign
197 IF( lsame( rc,
'R' ) )
THEN
199 ELSE IF( lsame( rc, 'c
' ) ) THEN
206.LT.
ELSE IF( MU0 ) THEN
208.LT.
ELSE IF( MV0 ) THEN
210.LT.
ELSE IF( N0 ) THEN
212.LT..OR..GT.
ELSE IF( K0 KMAX( MU, MV ) ) THEN
214.EQ..AND..LT..OR.
ELSE IF( ( IRC0 LDUMAX( 1, MU ) )
215.EQ..AND..LT.
$ ( IRC1 LDUMAX( 1, N ) ) ) THEN
217.EQ..AND..LT..OR.
ELSE IF( ( IRC0 LDVMAX( 1, MV ) )
218.EQ..AND..LT.
$ ( IRC1 LDVMAX( 1, N ) ) ) THEN
222 CALL XERBLA( 'sort03', -INFO )
229.EQ..OR..EQ..OR..EQ.
IF( MU0 MV0 N0 )
234 ULP = SLAMCH( 'precision
' )
242 LMX = ISAMAX( N, U( I, 1 ), LDU )
243 S = SIGN( ONE, U( I, LMX ) )*SIGN( ONE, V( I, LMX ) )
245 RES1 = MAX( RES1, ABS( U( I, J )-S*V( I, J ) ) )
248 RES1 = RES1 / ( REAL( N )*ULP )
252 CALL SORT01( 'rows
', MV, N, V, LDV, WORK, LWORK, RES2 )
260 LMX = ISAMAX( N, U( 1, I ), 1 )
261 S = SIGN( ONE, U( LMX, I ) )*SIGN( ONE, V( LMX, I ) )
263 RES1 = MAX( RES1, ABS( U( J, I )-S*V( J, I ) ) )
266 RES1 = RES1 / ( REAL( N )*ULP )
270 CALL SORT01( 'columns
', N, MV, V, LDV, WORK, LWORK, RES2 )
273 RESULT = MIN( MAX( RES1, RES2 ), ONE / ULP )
subroutine sort01(rowcol, m, n, u, ldu, work, lwork, resid)
SORT01
subroutine sort03(rc, mu, mv, n, k, u, ldu, v, ldv, work, lwork, result, info)
SORT03