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