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