00001 SUBROUTINE CGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
00002 $ WORK, RWORK, INFO )
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 CHARACTER NORM
00013 INTEGER INFO, KL, KU, LDAB, N
00014 REAL ANORM, RCOND
00015
00016
00017 INTEGER IPIV( * )
00018 REAL RWORK( * )
00019 COMPLEX AB( LDAB, * ), WORK( * )
00020
00021
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 REAL ONE, ZERO
00085 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00086
00087
00088 LOGICAL LNOTI, ONENRM
00089 CHARACTER NORMIN
00090 INTEGER IX, J, JP, KASE, KASE1, KD, LM
00091 REAL AINVNM, SCALE, SMLNUM
00092 COMPLEX T, ZDUM
00093
00094
00095 INTEGER ISAVE( 3 )
00096
00097
00098 LOGICAL LSAME
00099 INTEGER ICAMAX
00100 REAL SLAMCH
00101 COMPLEX CDOTC
00102 EXTERNAL LSAME, ICAMAX, SLAMCH, CDOTC
00103
00104
00105 EXTERNAL CAXPY, CLACN2, CLATBS, CSRSCL, XERBLA
00106
00107
00108 INTRINSIC ABS, AIMAG, MIN, REAL
00109
00110
00111 REAL CABS1
00112
00113
00114 CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
00115
00116
00117
00118
00119
00120 INFO = 0
00121 ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
00122 IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
00123 INFO = -1
00124 ELSE IF( N.LT.0 ) THEN
00125 INFO = -2
00126 ELSE IF( KL.LT.0 ) THEN
00127 INFO = -3
00128 ELSE IF( KU.LT.0 ) THEN
00129 INFO = -4
00130 ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
00131 INFO = -6
00132 ELSE IF( ANORM.LT.ZERO ) THEN
00133 INFO = -8
00134 END IF
00135 IF( INFO.NE.0 ) THEN
00136 CALL XERBLA( 'CGBCON', -INFO )
00137 RETURN
00138 END IF
00139
00140
00141
00142 RCOND = ZERO
00143 IF( N.EQ.0 ) THEN
00144 RCOND = ONE
00145 RETURN
00146 ELSE IF( ANORM.EQ.ZERO ) THEN
00147 RETURN
00148 END IF
00149
00150 SMLNUM = SLAMCH( 'Safe minimum' )
00151
00152
00153
00154 AINVNM = ZERO
00155 NORMIN = 'N'
00156 IF( ONENRM ) THEN
00157 KASE1 = 1
00158 ELSE
00159 KASE1 = 2
00160 END IF
00161 KD = KL + KU + 1
00162 LNOTI = KL.GT.0
00163 KASE = 0
00164 10 CONTINUE
00165 CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
00166 IF( KASE.NE.0 ) THEN
00167 IF( KASE.EQ.KASE1 ) THEN
00168
00169
00170
00171 IF( LNOTI ) THEN
00172 DO 20 J = 1, N - 1
00173 LM = MIN( KL, N-J )
00174 JP = IPIV( J )
00175 T = WORK( JP )
00176 IF( JP.NE.J ) THEN
00177 WORK( JP ) = WORK( J )
00178 WORK( J ) = T
00179 END IF
00180 CALL CAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
00181 20 CONTINUE
00182 END IF
00183
00184
00185
00186 CALL CLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
00187 $ KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
00188 ELSE
00189
00190
00191
00192 CALL CLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
00193 $ NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK,
00194 $ INFO )
00195
00196
00197
00198 IF( LNOTI ) THEN
00199 DO 30 J = N - 1, 1, -1
00200 LM = MIN( KL, N-J )
00201 WORK( J ) = WORK( J ) - CDOTC( LM, AB( KD+1, J ), 1,
00202 $ WORK( J+1 ), 1 )
00203 JP = IPIV( J )
00204 IF( JP.NE.J ) THEN
00205 T = WORK( JP )
00206 WORK( JP ) = WORK( J )
00207 WORK( J ) = T
00208 END IF
00209 30 CONTINUE
00210 END IF
00211 END IF
00212
00213
00214
00215 NORMIN = 'Y'
00216 IF( SCALE.NE.ONE ) THEN
00217 IX = ICAMAX( N, WORK, 1 )
00218 IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
00219 $ GO TO 40
00220 CALL CSRSCL( N, SCALE, WORK, 1 )
00221 END IF
00222 GO TO 10
00223 END IF
00224
00225
00226
00227 IF( AINVNM.NE.ZERO )
00228 $ RCOND = ( ONE / AINVNM ) / ANORM
00229
00230 40 CONTINUE
00231 RETURN
00232
00233
00234
00235 END