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