00001 SUBROUTINE DPPT01( UPLO, N, A, AFAC, RWORK, RESID )
00002
00003
00004
00005
00006
00007
00008 CHARACTER UPLO
00009 INTEGER N
00010 DOUBLE PRECISION RESID
00011
00012
00013 DOUBLE PRECISION A( * ), AFAC( * ), RWORK( * )
00014
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 DOUBLE PRECISION ZERO, ONE
00057 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00058
00059
00060 INTEGER I, K, KC, NPP
00061 DOUBLE PRECISION ANORM, EPS, T
00062
00063
00064 LOGICAL LSAME
00065 DOUBLE PRECISION DDOT, DLAMCH, DLANSP
00066 EXTERNAL LSAME, DDOT, DLAMCH, DLANSP
00067
00068
00069 EXTERNAL DSCAL, DSPR, DTPMV
00070
00071
00072 INTRINSIC DBLE
00073
00074
00075
00076
00077
00078 IF( N.LE.0 ) THEN
00079 RESID = ZERO
00080 RETURN
00081 END IF
00082
00083
00084
00085 EPS = DLAMCH( 'Epsilon' )
00086 ANORM = DLANSP( '1', UPLO, N, A, RWORK )
00087 IF( ANORM.LE.ZERO ) THEN
00088 RESID = ONE / EPS
00089 RETURN
00090 END IF
00091
00092
00093
00094 IF( LSAME( UPLO, 'U' ) ) THEN
00095 KC = ( N*( N-1 ) ) / 2 + 1
00096 DO 10 K = N, 1, -1
00097
00098
00099
00100 T = DDOT( K, AFAC( KC ), 1, AFAC( KC ), 1 )
00101 AFAC( KC+K-1 ) = T
00102
00103
00104
00105 IF( K.GT.1 ) THEN
00106 CALL DTPMV( 'Upper', 'Transpose', 'Non-unit', K-1, AFAC,
00107 $ AFAC( KC ), 1 )
00108 KC = KC - ( K-1 )
00109 END IF
00110 10 CONTINUE
00111
00112
00113
00114 ELSE
00115 KC = ( N*( N+1 ) ) / 2
00116 DO 20 K = N, 1, -1
00117
00118
00119
00120
00121 IF( K.LT.N )
00122 $ CALL DSPR( 'Lower', N-K, ONE, AFAC( KC+1 ), 1,
00123 $ AFAC( KC+N-K+1 ) )
00124
00125
00126
00127 T = AFAC( KC )
00128 CALL DSCAL( N-K+1, T, AFAC( KC ), 1 )
00129
00130 KC = KC - ( N-K+2 )
00131 20 CONTINUE
00132 END IF
00133
00134
00135
00136 NPP = N*( N+1 ) / 2
00137 DO 30 I = 1, NPP
00138 AFAC( I ) = AFAC( I ) - A( I )
00139 30 CONTINUE
00140
00141
00142
00143 RESID = DLANSP( '1', UPLO, N, AFAC, RWORK )
00144
00145 RESID = ( ( RESID / DBLE( N ) ) / ANORM ) / EPS
00146
00147 RETURN
00148
00149
00150
00151 END