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