00001 SUBROUTINE ZUNT03( RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK,
00002 $ RWORK, RESULT, INFO )
00003
00004
00005
00006
00007
00008
00009 CHARACTER*( * ) RC
00010 INTEGER INFO, K, LDU, LDV, LWORK, MU, MV, N
00011 DOUBLE PRECISION RESULT
00012
00013
00014 DOUBLE PRECISION RWORK( * )
00015 COMPLEX*16 U( LDU, * ), V( LDV, * ), WORK( * )
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 DOUBLE PRECISION ZERO, ONE
00102 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
00103
00104
00105 INTEGER I, IRC, J, LMX
00106 DOUBLE PRECISION RES1, RES2, ULP
00107 COMPLEX*16 S, SU, SV
00108
00109
00110 LOGICAL LSAME
00111 INTEGER IZAMAX
00112 DOUBLE PRECISION DLAMCH
00113 EXTERNAL LSAME, IZAMAX, DLAMCH
00114
00115
00116 INTRINSIC ABS, DBLE, DCMPLX, MAX, MIN
00117
00118
00119 EXTERNAL XERBLA, ZUNT01
00120
00121
00122
00123
00124
00125 INFO = 0
00126 IF( LSAME( RC, 'R' ) ) THEN
00127 IRC = 0
00128 ELSE IF( LSAME( RC, 'C' ) ) THEN
00129 IRC = 1
00130 ELSE
00131 IRC = -1
00132 END IF
00133 IF( IRC.EQ.-1 ) THEN
00134 INFO = -1
00135 ELSE IF( MU.LT.0 ) THEN
00136 INFO = -2
00137 ELSE IF( MV.LT.0 ) THEN
00138 INFO = -3
00139 ELSE IF( N.LT.0 ) THEN
00140 INFO = -4
00141 ELSE IF( K.LT.0 .OR. K.GT.MAX( MU, MV ) ) THEN
00142 INFO = -5
00143 ELSE IF( ( IRC.EQ.0 .AND. LDU.LT.MAX( 1, MU ) ) .OR.
00144 $ ( IRC.EQ.1 .AND. LDU.LT.MAX( 1, N ) ) ) THEN
00145 INFO = -7
00146 ELSE IF( ( IRC.EQ.0 .AND. LDV.LT.MAX( 1, MV ) ) .OR.
00147 $ ( IRC.EQ.1 .AND. LDV.LT.MAX( 1, N ) ) ) THEN
00148 INFO = -9
00149 END IF
00150 IF( INFO.NE.0 ) THEN
00151 CALL XERBLA( 'ZUNT03', -INFO )
00152 RETURN
00153 END IF
00154
00155
00156
00157 RESULT = ZERO
00158 IF( MU.EQ.0 .OR. MV.EQ.0 .OR. N.EQ.0 )
00159 $ RETURN
00160
00161
00162
00163 ULP = DLAMCH( 'Precision' )
00164
00165 IF( IRC.EQ.0 ) THEN
00166
00167
00168
00169 RES1 = ZERO
00170 DO 20 I = 1, K
00171 LMX = IZAMAX( N, U( I, 1 ), LDU )
00172 IF( V( I, LMX ).EQ.DCMPLX( ZERO ) ) THEN
00173 SV = ONE
00174 ELSE
00175 SV = ABS( V( I, LMX ) ) / V( I, LMX )
00176 END IF
00177 IF( U( I, LMX ).EQ.DCMPLX( ZERO ) ) THEN
00178 SU = ONE
00179 ELSE
00180 SU = ABS( U( I, LMX ) ) / U( I, LMX )
00181 END IF
00182 S = SV / SU
00183 DO 10 J = 1, N
00184 RES1 = MAX( RES1, ABS( U( I, J )-S*V( I, J ) ) )
00185 10 CONTINUE
00186 20 CONTINUE
00187 RES1 = RES1 / ( DBLE( N )*ULP )
00188
00189
00190
00191 CALL ZUNT01( 'Rows', MV, N, V, LDV, WORK, LWORK, RWORK, RES2 )
00192
00193 ELSE
00194
00195
00196
00197 RES1 = ZERO
00198 DO 40 I = 1, K
00199 LMX = IZAMAX( N, U( 1, I ), 1 )
00200 IF( V( LMX, I ).EQ.DCMPLX( ZERO ) ) THEN
00201 SV = ONE
00202 ELSE
00203 SV = ABS( V( LMX, I ) ) / V( LMX, I )
00204 END IF
00205 IF( U( LMX, I ).EQ.DCMPLX( ZERO ) ) THEN
00206 SU = ONE
00207 ELSE
00208 SU = ABS( U( LMX, I ) ) / U( LMX, I )
00209 END IF
00210 S = SV / SU
00211 DO 30 J = 1, N
00212 RES1 = MAX( RES1, ABS( U( J, I )-S*V( J, I ) ) )
00213 30 CONTINUE
00214 40 CONTINUE
00215 RES1 = RES1 / ( DBLE( N )*ULP )
00216
00217
00218
00219 CALL ZUNT01( 'Columns', N, MV, V, LDV, WORK, LWORK, RWORK,
00220 $ RES2 )
00221 END IF
00222
00223 RESULT = MIN( MAX( RES1, RES2 ), ONE / ULP )
00224 RETURN
00225
00226
00227
00228 END