00001 SUBROUTINE ZHET01( UPLO, N, A, LDA, AFAC, LDAFAC, IPIV, C, LDC,
00002 $ RWORK, RESID )
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER LDA, LDAFAC, LDC, N
00011 DOUBLE PRECISION RESID
00012
00013
00014 INTEGER IPIV( * )
00015 DOUBLE PRECISION RWORK( * )
00016 COMPLEX*16 A( LDA, * ), AFAC( LDAFAC, * ), C( LDC, * )
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 DOUBLE PRECISION ZERO, ONE
00074 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00075 COMPLEX*16 CZERO, CONE
00076 PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
00077 $ CONE = ( 1.0D+0, 0.0D+0 ) )
00078
00079
00080 INTEGER I, INFO, J
00081 DOUBLE PRECISION ANORM, EPS
00082
00083
00084 LOGICAL LSAME
00085 DOUBLE PRECISION DLAMCH, ZLANHE
00086 EXTERNAL LSAME, DLAMCH, ZLANHE
00087
00088
00089 EXTERNAL ZLASET, ZLAVHE
00090
00091
00092 INTRINSIC DBLE, DIMAG
00093
00094
00095
00096
00097
00098 IF( N.LE.0 ) THEN
00099 RESID = ZERO
00100 RETURN
00101 END IF
00102
00103
00104
00105 EPS = DLAMCH( 'Epsilon' )
00106 ANORM = ZLANHE( '1', UPLO, N, A, LDA, RWORK )
00107
00108
00109
00110
00111 DO 10 J = 1, N
00112 IF( DIMAG( AFAC( J, J ) ).NE.ZERO ) THEN
00113 RESID = ONE / EPS
00114 RETURN
00115 END IF
00116 10 CONTINUE
00117
00118
00119
00120 CALL ZLASET( 'Full', N, N, CZERO, CONE, C, LDC )
00121
00122
00123
00124 CALL ZLAVHE( UPLO, 'Conjugate', 'Non-unit', N, N, AFAC, LDAFAC,
00125 $ IPIV, C, LDC, INFO )
00126
00127
00128
00129 CALL ZLAVHE( UPLO, 'No transpose', 'Unit', N, N, AFAC, LDAFAC,
00130 $ IPIV, C, LDC, INFO )
00131
00132
00133
00134 IF( LSAME( UPLO, 'U' ) ) THEN
00135 DO 30 J = 1, N
00136 DO 20 I = 1, J - 1
00137 C( I, J ) = C( I, J ) - A( I, J )
00138 20 CONTINUE
00139 C( J, J ) = C( J, J ) - DBLE( A( J, J ) )
00140 30 CONTINUE
00141 ELSE
00142 DO 50 J = 1, N
00143 C( J, J ) = C( J, J ) - DBLE( A( J, J ) )
00144 DO 40 I = J + 1, N
00145 C( I, J ) = C( I, J ) - A( I, J )
00146 40 CONTINUE
00147 50 CONTINUE
00148 END IF
00149
00150
00151
00152 RESID = ZLANHE( '1', UPLO, N, C, LDC, RWORK )
00153
00154 IF( ANORM.LE.ZERO ) THEN
00155 IF( RESID.NE.ZERO )
00156 $ RESID = ONE / EPS
00157 ELSE
00158 RESID = ( ( RESID / DBLE( N ) ) / ANORM ) / EPS
00159 END IF
00160
00161 RETURN
00162
00163
00164
00165 END