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