00001 DOUBLE PRECISION FUNCTION ZLA_GBRCOND_C( TRANS, N, KL, KU, AB,
00002 $ LDAB, AFB, LDAFB, IPIV,
00003 $ C, CAPPLY, INFO, WORK,
00004 $ RWORK )
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 IMPLICIT NONE
00015
00016
00017 CHARACTER TRANS
00018 LOGICAL CAPPLY
00019 INTEGER N, KL, KU, KD, KE, LDAB, LDAFB, INFO
00020
00021
00022 INTEGER IPIV( * )
00023 COMPLEX*16 AB( LDAB, * ), AFB( LDAFB, * ), WORK( * )
00024 DOUBLE PRECISION C( * ), RWORK( * )
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
00092
00093
00094
00095 LOGICAL NOTRANS
00096 INTEGER KASE, I, J
00097 DOUBLE PRECISION AINVNM, ANORM, TMP
00098 COMPLEX*16 ZDUM
00099
00100
00101 INTEGER ISAVE( 3 )
00102
00103
00104 LOGICAL LSAME
00105 EXTERNAL LSAME
00106
00107
00108 EXTERNAL ZLACN2, ZGBTRS, XERBLA
00109
00110
00111 INTRINSIC ABS, MAX
00112
00113
00114 DOUBLE PRECISION CABS1
00115
00116
00117 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
00118
00119
00120 ZLA_GBRCOND_C = 0.0D+0
00121
00122 INFO = 0
00123 NOTRANS = LSAME( TRANS, 'N' )
00124 IF ( .NOT. NOTRANS .AND. .NOT. LSAME( TRANS, 'T' ) .AND. .NOT.
00125 $ LSAME( TRANS, 'C' ) ) THEN
00126 INFO = -1
00127 ELSE IF( N.LT.0 ) THEN
00128 INFO = -2
00129 ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
00130 INFO = -3
00131 ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
00132 INFO = -4
00133 ELSE IF( LDAB.LT.KL+KU+1 ) THEN
00134 INFO = -6
00135 ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
00136 INFO = -8
00137 END IF
00138 IF( INFO.NE.0 ) THEN
00139 CALL XERBLA( 'ZLA_GBRCOND_C', -INFO )
00140 RETURN
00141 END IF
00142
00143
00144
00145 ANORM = 0.0D+0
00146 KD = KU + 1
00147 KE = KL + 1
00148 IF ( NOTRANS ) THEN
00149 DO I = 1, N
00150 TMP = 0.0D+0
00151 IF ( CAPPLY ) THEN
00152 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00153 TMP = TMP + CABS1( AB( KD+I-J, J ) ) / C( J )
00154 END DO
00155 ELSE
00156 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00157 TMP = TMP + CABS1( AB( KD+I-J, J ) )
00158 END DO
00159 END IF
00160 RWORK( I ) = TMP
00161 ANORM = MAX( ANORM, TMP )
00162 END DO
00163 ELSE
00164 DO I = 1, N
00165 TMP = 0.0D+0
00166 IF ( CAPPLY ) THEN
00167 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00168 TMP = TMP + CABS1( AB( KE-I+J, I ) ) / C( J )
00169 END DO
00170 ELSE
00171 DO J = MAX( I-KL, 1 ), MIN( I+KU, N )
00172 TMP = TMP + CABS1( AB( KE-I+J, I ) )
00173 END DO
00174 END IF
00175 RWORK( I ) = TMP
00176 ANORM = MAX( ANORM, TMP )
00177 END DO
00178 END IF
00179
00180
00181
00182 IF( N.EQ.0 ) THEN
00183 ZLA_GBRCOND_C = 1.0D+0
00184 RETURN
00185 ELSE IF( ANORM .EQ. 0.0D+0 ) THEN
00186 RETURN
00187 END IF
00188
00189
00190
00191 AINVNM = 0.0D+0
00192
00193 KASE = 0
00194 10 CONTINUE
00195 CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
00196 IF( KASE.NE.0 ) THEN
00197 IF( KASE.EQ.2 ) THEN
00198
00199
00200
00201 DO I = 1, N
00202 WORK( I ) = WORK( I ) * RWORK( I )
00203 END DO
00204
00205 IF ( NOTRANS ) THEN
00206 CALL ZGBTRS( 'No transpose', N, KL, KU, 1, AFB, LDAFB,
00207 $ IPIV, WORK, N, INFO )
00208 ELSE
00209 CALL ZGBTRS( 'Conjugate transpose', N, KL, KU, 1, AFB,
00210 $ LDAFB, IPIV, WORK, N, INFO )
00211 ENDIF
00212
00213
00214
00215 IF ( CAPPLY ) 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 ( CAPPLY ) THEN
00225 DO I = 1, N
00226 WORK( I ) = WORK( I ) * C( I )
00227 END DO
00228 END IF
00229
00230 IF ( NOTRANS ) THEN
00231 CALL ZGBTRS( 'Conjugate transpose', N, KL, KU, 1, AFB,
00232 $ LDAFB, IPIV, WORK, N, INFO )
00233 ELSE
00234 CALL ZGBTRS( 'No transpose', N, KL, KU, 1, AFB, LDAFB,
00235 $ IPIV, WORK, N, INFO )
00236 END IF
00237
00238
00239
00240 DO I = 1, N
00241 WORK( I ) = WORK( I ) * RWORK( I )
00242 END DO
00243 END IF
00244 GO TO 10
00245 END IF
00246
00247
00248
00249 IF( AINVNM .NE. 0.0D+0 )
00250 $ ZLA_GBRCOND_C = 1.0D+0 / AINVNM
00251
00252 RETURN
00253
00254 END