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