00001 SUBROUTINE ZGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, W,
00002 $ WORK, RWORK, RESULT )
00003
00004
00005
00006
00007
00008
00009 CHARACTER TRANSA, TRANSE, TRANSW
00010 INTEGER LDA, LDE, N
00011
00012
00013 DOUBLE PRECISION RESULT( 2 ), RWORK( * )
00014 COMPLEX*16 A( LDA, * ), E( LDE, * ), W( * ), WORK( * )
00015
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 DOUBLE PRECISION ZERO, ONE
00088 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00089 COMPLEX*16 CZERO, CONE
00090 PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
00091 $ CONE = ( 1.0D+0, 0.0D+0 ) )
00092
00093
00094 CHARACTER NORMA, NORME
00095 INTEGER ITRNSE, ITRNSW, J, JCOL, JOFF, JROW, JVEC
00096 DOUBLE PRECISION ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
00097 $ ULP, UNFL
00098 COMPLEX*16 WTEMP
00099
00100
00101 LOGICAL LSAME
00102 DOUBLE PRECISION DLAMCH, ZLANGE
00103 EXTERNAL LSAME, DLAMCH, ZLANGE
00104
00105
00106 EXTERNAL ZGEMM, ZLASET
00107
00108
00109 INTRINSIC ABS, DBLE, DCONJG, DIMAG, MAX, MIN
00110
00111
00112
00113
00114
00115 RESULT( 1 ) = ZERO
00116 RESULT( 2 ) = ZERO
00117 IF( N.LE.0 )
00118 $ RETURN
00119
00120 UNFL = DLAMCH( 'Safe minimum' )
00121 ULP = DLAMCH( 'Precision' )
00122
00123 ITRNSE = 0
00124 ITRNSW = 0
00125 NORMA = 'O'
00126 NORME = 'O'
00127
00128 IF( LSAME( TRANSA, 'T' ) .OR. LSAME( TRANSA, 'C' ) ) THEN
00129 NORMA = 'I'
00130 END IF
00131
00132 IF( LSAME( TRANSE, 'T' ) ) THEN
00133 ITRNSE = 1
00134 NORME = 'I'
00135 ELSE IF( LSAME( TRANSE, 'C' ) ) THEN
00136 ITRNSE = 2
00137 NORME = 'I'
00138 END IF
00139
00140 IF( LSAME( TRANSW, 'C' ) ) THEN
00141 ITRNSW = 1
00142 END IF
00143
00144
00145
00146 ENRMIN = ONE / ULP
00147 ENRMAX = ZERO
00148 IF( ITRNSE.EQ.0 ) THEN
00149 DO 20 JVEC = 1, N
00150 TEMP1 = ZERO
00151 DO 10 J = 1, N
00152 TEMP1 = MAX( TEMP1, ABS( DBLE( E( J, JVEC ) ) )+
00153 $ ABS( DIMAG( E( J, JVEC ) ) ) )
00154 10 CONTINUE
00155 ENRMIN = MIN( ENRMIN, TEMP1 )
00156 ENRMAX = MAX( ENRMAX, TEMP1 )
00157 20 CONTINUE
00158 ELSE
00159 DO 30 JVEC = 1, N
00160 RWORK( JVEC ) = ZERO
00161 30 CONTINUE
00162
00163 DO 50 J = 1, N
00164 DO 40 JVEC = 1, N
00165 RWORK( JVEC ) = MAX( RWORK( JVEC ),
00166 $ ABS( DBLE( E( JVEC, J ) ) )+
00167 $ ABS( DIMAG( E( JVEC, J ) ) ) )
00168 40 CONTINUE
00169 50 CONTINUE
00170
00171 DO 60 JVEC = 1, N
00172 ENRMIN = MIN( ENRMIN, RWORK( JVEC ) )
00173 ENRMAX = MAX( ENRMAX, RWORK( JVEC ) )
00174 60 CONTINUE
00175 END IF
00176
00177
00178
00179 ANORM = MAX( ZLANGE( NORMA, N, N, A, LDA, RWORK ), UNFL )
00180
00181
00182
00183 ENORM = MAX( ZLANGE( NORME, N, N, E, LDE, RWORK ), ULP )
00184
00185
00186
00187
00188
00189 CALL ZLASET( 'Full', N, N, CZERO, CZERO, WORK, N )
00190
00191 JOFF = 0
00192 DO 100 JCOL = 1, N
00193 IF( ITRNSW.EQ.0 ) THEN
00194 WTEMP = W( JCOL )
00195 ELSE
00196 WTEMP = DCONJG( W( JCOL ) )
00197 END IF
00198
00199 IF( ITRNSE.EQ.0 ) THEN
00200 DO 70 JROW = 1, N
00201 WORK( JOFF+JROW ) = E( JROW, JCOL )*WTEMP
00202 70 CONTINUE
00203 ELSE IF( ITRNSE.EQ.1 ) THEN
00204 DO 80 JROW = 1, N
00205 WORK( JOFF+JROW ) = E( JCOL, JROW )*WTEMP
00206 80 CONTINUE
00207 ELSE
00208 DO 90 JROW = 1, N
00209 WORK( JOFF+JROW ) = DCONJG( E( JCOL, JROW ) )*WTEMP
00210 90 CONTINUE
00211 END IF
00212 JOFF = JOFF + N
00213 100 CONTINUE
00214
00215 CALL ZGEMM( TRANSA, TRANSE, N, N, N, CONE, A, LDA, E, LDE, -CONE,
00216 $ WORK, N )
00217
00218 ERRNRM = ZLANGE( 'One', N, N, WORK, N, RWORK ) / ENORM
00219
00220
00221
00222 IF( ANORM.GT.ERRNRM ) THEN
00223 RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
00224 ELSE
00225 IF( ANORM.LT.ONE ) THEN
00226 RESULT( 1 ) = ( MIN( ERRNRM, ANORM ) / ANORM ) / ULP
00227 ELSE
00228 RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
00229 END IF
00230 END IF
00231
00232
00233
00234 RESULT( 2 ) = MAX( ABS( ENRMAX-ONE ), ABS( ENRMIN-ONE ) ) /
00235 $ ( DBLE( N )*ULP )
00236
00237 RETURN
00238
00239
00240
00241 END