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