00001 SUBROUTINE CGTT05( TRANS, N, NRHS, DL, D, DU, B, LDB, X, LDX,
00002 $ XACT, LDXACT, FERR, BERR, RESLTS )
00003
00004
00005
00006
00007
00008
00009 CHARACTER TRANS
00010 INTEGER LDB, LDX, LDXACT, N, NRHS
00011
00012
00013 REAL BERR( * ), FERR( * ), RESLTS( * )
00014 COMPLEX B( LDB, * ), D( * ), DL( * ), DU( * ),
00015 $ X( LDX, * ), XACT( LDXACT, * )
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 REAL ZERO, ONE
00101 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
00102
00103
00104 LOGICAL NOTRAN
00105 INTEGER I, IMAX, J, K, NZ
00106 REAL AXBI, DIFF, EPS, ERRBND, OVFL, TMP, UNFL, XNORM
00107 COMPLEX ZDUM
00108
00109
00110 LOGICAL LSAME
00111 INTEGER ICAMAX
00112 REAL SLAMCH
00113 EXTERNAL LSAME, ICAMAX, SLAMCH
00114
00115
00116 INTRINSIC ABS, AIMAG, MAX, MIN, REAL
00117
00118
00119 REAL CABS1
00120
00121
00122 CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
00123
00124
00125
00126
00127
00128 IF( N.LE.0 .OR. NRHS.LE.0 ) THEN
00129 RESLTS( 1 ) = ZERO
00130 RESLTS( 2 ) = ZERO
00131 RETURN
00132 END IF
00133
00134 EPS = SLAMCH( 'Epsilon' )
00135 UNFL = SLAMCH( 'Safe minimum' )
00136 OVFL = ONE / UNFL
00137 NOTRAN = LSAME( TRANS, 'N' )
00138 NZ = 4
00139
00140
00141
00142
00143
00144 ERRBND = ZERO
00145 DO 30 J = 1, NRHS
00146 IMAX = ICAMAX( N, X( 1, J ), 1 )
00147 XNORM = MAX( CABS1( X( IMAX, J ) ), UNFL )
00148 DIFF = ZERO
00149 DO 10 I = 1, N
00150 DIFF = MAX( DIFF, CABS1( X( I, J )-XACT( I, J ) ) )
00151 10 CONTINUE
00152
00153 IF( XNORM.GT.ONE ) THEN
00154 GO TO 20
00155 ELSE IF( DIFF.LE.OVFL*XNORM ) THEN
00156 GO TO 20
00157 ELSE
00158 ERRBND = ONE / EPS
00159 GO TO 30
00160 END IF
00161
00162 20 CONTINUE
00163 IF( DIFF / XNORM.LE.FERR( J ) ) THEN
00164 ERRBND = MAX( ERRBND, ( DIFF / XNORM ) / FERR( J ) )
00165 ELSE
00166 ERRBND = ONE / EPS
00167 END IF
00168 30 CONTINUE
00169 RESLTS( 1 ) = ERRBND
00170
00171
00172
00173
00174 DO 60 K = 1, NRHS
00175 IF( NOTRAN ) THEN
00176 IF( N.EQ.1 ) THEN
00177 AXBI = CABS1( B( 1, K ) ) +
00178 $ CABS1( D( 1 ) )*CABS1( X( 1, K ) )
00179 ELSE
00180 AXBI = CABS1( B( 1, K ) ) +
00181 $ CABS1( D( 1 ) )*CABS1( X( 1, K ) ) +
00182 $ CABS1( DU( 1 ) )*CABS1( X( 2, K ) )
00183 DO 40 I = 2, N - 1
00184 TMP = CABS1( B( I, K ) ) +
00185 $ CABS1( DL( I-1 ) )*CABS1( X( I-1, K ) ) +
00186 $ CABS1( D( I ) )*CABS1( X( I, K ) ) +
00187 $ CABS1( DU( I ) )*CABS1( X( I+1, K ) )
00188 AXBI = MIN( AXBI, TMP )
00189 40 CONTINUE
00190 TMP = CABS1( B( N, K ) ) + CABS1( DL( N-1 ) )*
00191 $ CABS1( X( N-1, K ) ) + CABS1( D( N ) )*
00192 $ CABS1( X( N, K ) )
00193 AXBI = MIN( AXBI, TMP )
00194 END IF
00195 ELSE
00196 IF( N.EQ.1 ) THEN
00197 AXBI = CABS1( B( 1, K ) ) +
00198 $ CABS1( D( 1 ) )*CABS1( X( 1, K ) )
00199 ELSE
00200 AXBI = CABS1( B( 1, K ) ) +
00201 $ CABS1( D( 1 ) )*CABS1( X( 1, K ) ) +
00202 $ CABS1( DL( 1 ) )*CABS1( X( 2, K ) )
00203 DO 50 I = 2, N - 1
00204 TMP = CABS1( B( I, K ) ) +
00205 $ CABS1( DU( I-1 ) )*CABS1( X( I-1, K ) ) +
00206 $ CABS1( D( I ) )*CABS1( X( I, K ) ) +
00207 $ CABS1( DL( I ) )*CABS1( X( I+1, K ) )
00208 AXBI = MIN( AXBI, TMP )
00209 50 CONTINUE
00210 TMP = CABS1( B( N, K ) ) + CABS1( DU( N-1 ) )*
00211 $ CABS1( X( N-1, K ) ) + CABS1( D( N ) )*
00212 $ CABS1( X( N, K ) )
00213 AXBI = MIN( AXBI, TMP )
00214 END IF
00215 END IF
00216 TMP = BERR( K ) / ( NZ*EPS+NZ*UNFL / MAX( AXBI, NZ*UNFL ) )
00217 IF( K.EQ.1 ) THEN
00218 RESLTS( 2 ) = TMP
00219 ELSE
00220 RESLTS( 2 ) = MAX( RESLTS( 2 ), TMP )
00221 END IF
00222 60 CONTINUE
00223
00224 RETURN
00225
00226
00227
00228 END