00001 DOUBLE PRECISION FUNCTION ZLA_HERCOND_C( UPLO, N, A, LDA, AF,
00002 $ LDAF, IPIV, C, CAPPLY,
00003 $ INFO, WORK, RWORK )
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 IMPLICIT NONE
00014
00015
00016 CHARACTER UPLO
00017 LOGICAL CAPPLY
00018 INTEGER N, LDA, LDAF, INFO
00019
00020
00021 INTEGER IPIV( * )
00022 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), WORK( * )
00023 DOUBLE PRECISION C ( * ), RWORK( * )
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 INTEGER KASE, I, J
00080 DOUBLE PRECISION AINVNM, ANORM, TMP
00081 LOGICAL UP
00082 COMPLEX*16 ZDUM
00083
00084
00085 INTEGER ISAVE( 3 )
00086
00087
00088 LOGICAL LSAME
00089 EXTERNAL LSAME
00090
00091
00092 EXTERNAL ZLACN2, ZHETRS, XERBLA
00093
00094
00095 INTRINSIC ABS, MAX
00096
00097
00098 DOUBLE PRECISION CABS1
00099
00100
00101 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
00102
00103
00104
00105 ZLA_HERCOND_C = 0.0D+0
00106
00107 INFO = 0
00108 IF( N.LT.0 ) THEN
00109 INFO = -2
00110 END IF
00111 IF( INFO.NE.0 ) THEN
00112 CALL XERBLA( 'ZLA_HERCOND_C', -INFO )
00113 RETURN
00114 END IF
00115 UP = .FALSE.
00116 IF ( LSAME( UPLO, 'U' ) ) UP = .TRUE.
00117
00118
00119
00120 ANORM = 0.0D+0
00121 IF ( UP ) THEN
00122 DO I = 1, N
00123 TMP = 0.0D+0
00124 IF ( CAPPLY ) THEN
00125 DO J = 1, I
00126 TMP = TMP + CABS1( A( J, I ) ) / C( J )
00127 END DO
00128 DO J = I+1, N
00129 TMP = TMP + CABS1( A( I, J ) ) / C( J )
00130 END DO
00131 ELSE
00132 DO J = 1, I
00133 TMP = TMP + CABS1( A( J, I ) )
00134 END DO
00135 DO J = I+1, N
00136 TMP = TMP + CABS1( A( I, J ) )
00137 END DO
00138 END IF
00139 RWORK( I ) = TMP
00140 ANORM = MAX( ANORM, TMP )
00141 END DO
00142 ELSE
00143 DO I = 1, N
00144 TMP = 0.0D+0
00145 IF ( CAPPLY ) THEN
00146 DO J = 1, I
00147 TMP = TMP + CABS1( A( I, J ) ) / C( J )
00148 END DO
00149 DO J = I+1, N
00150 TMP = TMP + CABS1( A( J, I ) ) / C( J )
00151 END DO
00152 ELSE
00153 DO J = 1, I
00154 TMP = TMP + CABS1( A( I, J ) )
00155 END DO
00156 DO J = I+1, N
00157 TMP = TMP + CABS1( A( J, I ) )
00158 END DO
00159 END IF
00160 RWORK( I ) = TMP
00161 ANORM = MAX( ANORM, TMP )
00162 END DO
00163 END IF
00164
00165
00166
00167 IF( N.EQ.0 ) THEN
00168 ZLA_HERCOND_C = 1.0D+0
00169 RETURN
00170 ELSE IF( ANORM .EQ. 0.0D+0 ) THEN
00171 RETURN
00172 END IF
00173
00174
00175
00176 AINVNM = 0.0D+0
00177
00178 KASE = 0
00179 10 CONTINUE
00180 CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
00181 IF( KASE.NE.0 ) THEN
00182 IF( KASE.EQ.2 ) THEN
00183
00184
00185
00186 DO I = 1, N
00187 WORK( I ) = WORK( I ) * RWORK( I )
00188 END DO
00189
00190 IF ( UP ) THEN
00191 CALL ZHETRS( 'U', N, 1, AF, LDAF, IPIV,
00192 $ WORK, N, INFO )
00193 ELSE
00194 CALL ZHETRS( 'L', N, 1, AF, LDAF, IPIV,
00195 $ WORK, N, INFO )
00196 ENDIF
00197
00198
00199
00200 IF ( CAPPLY ) THEN
00201 DO I = 1, N
00202 WORK( I ) = WORK( I ) * C( I )
00203 END DO
00204 END IF
00205 ELSE
00206
00207
00208
00209 IF ( CAPPLY ) THEN
00210 DO I = 1, N
00211 WORK( I ) = WORK( I ) * C( I )
00212 END DO
00213 END IF
00214
00215 IF ( UP ) THEN
00216 CALL ZHETRS( 'U', N, 1, AF, LDAF, IPIV,
00217 $ WORK, N, INFO )
00218 ELSE
00219 CALL ZHETRS( 'L', N, 1, AF, LDAF, IPIV,
00220 $ WORK, N, INFO )
00221 END IF
00222
00223
00224
00225 DO I = 1, N
00226 WORK( I ) = WORK( I ) * RWORK( I )
00227 END DO
00228 END IF
00229 GO TO 10
00230 END IF
00231
00232
00233
00234 IF( AINVNM .NE. 0.0D+0 )
00235 $ ZLA_HERCOND_C = 1.0D+0 / AINVNM
00236
00237 RETURN
00238
00239 END