00001 DOUBLE PRECISION FUNCTION ZLA_GBRCOND_X( TRANS, N, KL, KU, AB,
00002 $ LDAB, AFB, LDAFB, IPIV,
00003 $ X, INFO, WORK, RWORK )
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 IMPLICIT NONE
00014
00015
00016 CHARACTER TRANS
00017 INTEGER N, KL, KU, KD, KE, LDAB, LDAFB, INFO
00018
00019
00020 INTEGER IPIV( * )
00021 COMPLEX*16 AB( LDAB, * ), AFB( LDAFB, * ), WORK( * ),
00022 $ X( * )
00023 DOUBLE PRECISION 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
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 LOGICAL NOTRANS
00092 INTEGER KASE, I, J
00093 DOUBLE PRECISION AINVNM, ANORM, TMP
00094 COMPLEX*16 ZDUM
00095
00096
00097 INTEGER ISAVE( 3 )
00098
00099
00100 LOGICAL LSAME
00101 EXTERNAL LSAME
00102
00103
00104 EXTERNAL ZLACN2, ZGBTRS, XERBLA
00105
00106
00107 INTRINSIC ABS, MAX
00108
00109
00110 DOUBLE PRECISION CABS1
00111
00112
00113 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
00114
00115
00116
00117 ZLA_GBRCOND_X = 0.0D+0
00118
00119 INFO = 0
00120 NOTRANS = LSAME( TRANS, 'N' )
00121 IF ( .NOT. NOTRANS .AND. .NOT. LSAME(TRANS, 'T') .AND. .NOT.
00122 $ LSAME( TRANS, 'C' ) ) THEN
00123 INFO = -1
00124 ELSE IF( N.LT.0 ) THEN
00125 INFO = -2
00126 ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
00127 INFO = -3
00128 ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
00129 INFO = -4
00130 ELSE IF( LDAB.LT.KL+KU+1 ) THEN
00131 INFO = -6
00132 ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
00133 INFO = -8
00134 END IF
00135 IF( INFO.NE.0 ) THEN
00136 CALL XERBLA( 'ZLA_GBRCOND_X', -INFO )
00137 RETURN
00138 END IF
00139
00140
00141
00142 KD = KU + 1
00143 KE = KL + 1
00144 ANORM = 0.0D+0
00145 IF ( NOTRANS ) THEN
00146 DO I = 1, N
00147 TMP = 0.0D+0
00148 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00149 TMP = TMP + CABS1( AB( KD+I-J, J) * X( J ) )
00150 END DO
00151 RWORK( I ) = TMP
00152 ANORM = MAX( ANORM, TMP )
00153 END DO
00154 ELSE
00155 DO I = 1, N
00156 TMP = 0.0D+0
00157 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00158 TMP = TMP + CABS1( AB( KE-I+J, I ) * X( J ) )
00159 END DO
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_GBRCOND_X = 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 ( NOTRANS ) THEN
00191 CALL ZGBTRS( 'No transpose', N, KL, KU, 1, AFB, LDAFB,
00192 $ IPIV, WORK, N, INFO )
00193 ELSE
00194 CALL ZGBTRS( 'Conjugate transpose', N, KL, KU, 1, AFB,
00195 $ LDAFB, IPIV, WORK, N, INFO )
00196 ENDIF
00197
00198
00199
00200 DO I = 1, N
00201 WORK( I ) = WORK( I ) / X( I )
00202 END DO
00203 ELSE
00204
00205
00206
00207 DO I = 1, N
00208 WORK( I ) = WORK( I ) / X( I )
00209 END DO
00210
00211 IF ( NOTRANS ) THEN
00212 CALL ZGBTRS( 'Conjugate transpose', N, KL, KU, 1, AFB,
00213 $ LDAFB, IPIV, WORK, N, INFO )
00214 ELSE
00215 CALL ZGBTRS( 'No transpose', N, KL, KU, 1, AFB, LDAFB,
00216 $ IPIV, WORK, N, INFO )
00217 END IF
00218
00219
00220
00221 DO I = 1, N
00222 WORK( I ) = WORK( I ) * RWORK( I )
00223 END DO
00224 END IF
00225 GO TO 10
00226 END IF
00227
00228
00229
00230 IF( AINVNM .NE. 0.0D+0 )
00231 $ ZLA_GBRCOND_X = 1.0D+0 / AINVNM
00232
00233 RETURN
00234
00235 END