00001 SUBROUTINE DGBBRD( VECT, M, N, NCC, KL, KU, AB, LDAB, D, E, Q,
00002 $ LDQ, PT, LDPT, C, LDC, WORK, INFO )
00003
00004
00005
00006
00007
00008
00009
00010 CHARACTER VECT
00011 INTEGER INFO, KL, KU, LDAB, LDC, LDPT, LDQ, M, N, NCC
00012
00013
00014 DOUBLE PRECISION AB( LDAB, * ), C( LDC, * ), D( * ), E( * ),
00015 $ PT( LDPT, * ), Q( LDQ, * ), WORK( * )
00016
00017
00018
00019
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
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 DOUBLE PRECISION ZERO, ONE
00105 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00106
00107
00108 LOGICAL WANTB, WANTC, WANTPT, WANTQ
00109 INTEGER I, INCA, J, J1, J2, KB, KB1, KK, KLM, KLU1,
00110 $ KUN, L, MINMN, ML, ML0, MN, MU, MU0, NR, NRT
00111 DOUBLE PRECISION RA, RB, RC, RS
00112
00113
00114 EXTERNAL DLARGV, DLARTG, DLARTV, DLASET, DROT, XERBLA
00115
00116
00117 INTRINSIC MAX, MIN
00118
00119
00120 LOGICAL LSAME
00121 EXTERNAL LSAME
00122
00123
00124
00125
00126
00127 WANTB = LSAME( VECT, 'B' )
00128 WANTQ = LSAME( VECT, 'Q' ) .OR. WANTB
00129 WANTPT = LSAME( VECT, 'P' ) .OR. WANTB
00130 WANTC = NCC.GT.0
00131 KLU1 = KL + KU + 1
00132 INFO = 0
00133 IF( .NOT.WANTQ .AND. .NOT.WANTPT .AND. .NOT.LSAME( VECT, 'N' ) )
00134 $ THEN
00135 INFO = -1
00136 ELSE IF( M.LT.0 ) THEN
00137 INFO = -2
00138 ELSE IF( N.LT.0 ) THEN
00139 INFO = -3
00140 ELSE IF( NCC.LT.0 ) THEN
00141 INFO = -4
00142 ELSE IF( KL.LT.0 ) THEN
00143 INFO = -5
00144 ELSE IF( KU.LT.0 ) THEN
00145 INFO = -6
00146 ELSE IF( LDAB.LT.KLU1 ) THEN
00147 INFO = -8
00148 ELSE IF( LDQ.LT.1 .OR. WANTQ .AND. LDQ.LT.MAX( 1, M ) ) THEN
00149 INFO = -12
00150 ELSE IF( LDPT.LT.1 .OR. WANTPT .AND. LDPT.LT.MAX( 1, N ) ) THEN
00151 INFO = -14
00152 ELSE IF( LDC.LT.1 .OR. WANTC .AND. LDC.LT.MAX( 1, M ) ) THEN
00153 INFO = -16
00154 END IF
00155 IF( INFO.NE.0 ) THEN
00156 CALL XERBLA( 'DGBBRD', -INFO )
00157 RETURN
00158 END IF
00159
00160
00161
00162 IF( WANTQ )
00163 $ CALL DLASET( 'Full', M, M, ZERO, ONE, Q, LDQ )
00164 IF( WANTPT )
00165 $ CALL DLASET( 'Full', N, N, ZERO, ONE, PT, LDPT )
00166
00167
00168
00169 IF( M.EQ.0 .OR. N.EQ.0 )
00170 $ RETURN
00171
00172 MINMN = MIN( M, N )
00173
00174 IF( KL+KU.GT.1 ) THEN
00175
00176
00177
00178
00179
00180 IF( KU.GT.0 ) THEN
00181 ML0 = 1
00182 MU0 = 2
00183 ELSE
00184 ML0 = 2
00185 MU0 = 1
00186 END IF
00187
00188
00189
00190
00191
00192
00193
00194 MN = MAX( M, N )
00195 KLM = MIN( M-1, KL )
00196 KUN = MIN( N-1, KU )
00197 KB = KLM + KUN
00198 KB1 = KB + 1
00199 INCA = KB1*LDAB
00200 NR = 0
00201 J1 = KLM + 2
00202 J2 = 1 - KUN
00203
00204 DO 90 I = 1, MINMN
00205
00206
00207
00208 ML = KLM + 1
00209 MU = KUN + 1
00210 DO 80 KK = 1, KB
00211 J1 = J1 + KB
00212 J2 = J2 + KB
00213
00214
00215
00216
00217 IF( NR.GT.0 )
00218 $ CALL DLARGV( NR, AB( KLU1, J1-KLM-1 ), INCA,
00219 $ WORK( J1 ), KB1, WORK( MN+J1 ), KB1 )
00220
00221
00222
00223 DO 10 L = 1, KB
00224 IF( J2-KLM+L-1.GT.N ) THEN
00225 NRT = NR - 1
00226 ELSE
00227 NRT = NR
00228 END IF
00229 IF( NRT.GT.0 )
00230 $ CALL DLARTV( NRT, AB( KLU1-L, J1-KLM+L-1 ), INCA,
00231 $ AB( KLU1-L+1, J1-KLM+L-1 ), INCA,
00232 $ WORK( MN+J1 ), WORK( J1 ), KB1 )
00233 10 CONTINUE
00234
00235 IF( ML.GT.ML0 ) THEN
00236 IF( ML.LE.M-I+1 ) THEN
00237
00238
00239
00240
00241 CALL DLARTG( AB( KU+ML-1, I ), AB( KU+ML, I ),
00242 $ WORK( MN+I+ML-1 ), WORK( I+ML-1 ),
00243 $ RA )
00244 AB( KU+ML-1, I ) = RA
00245 IF( I.LT.N )
00246 $ CALL DROT( MIN( KU+ML-2, N-I ),
00247 $ AB( KU+ML-2, I+1 ), LDAB-1,
00248 $ AB( KU+ML-1, I+1 ), LDAB-1,
00249 $ WORK( MN+I+ML-1 ), WORK( I+ML-1 ) )
00250 END IF
00251 NR = NR + 1
00252 J1 = J1 - KB1
00253 END IF
00254
00255 IF( WANTQ ) THEN
00256
00257
00258
00259 DO 20 J = J1, J2, KB1
00260 CALL DROT( M, Q( 1, J-1 ), 1, Q( 1, J ), 1,
00261 $ WORK( MN+J ), WORK( J ) )
00262 20 CONTINUE
00263 END IF
00264
00265 IF( WANTC ) THEN
00266
00267
00268
00269 DO 30 J = J1, J2, KB1
00270 CALL DROT( NCC, C( J-1, 1 ), LDC, C( J, 1 ), LDC,
00271 $ WORK( MN+J ), WORK( J ) )
00272 30 CONTINUE
00273 END IF
00274
00275 IF( J2+KUN.GT.N ) THEN
00276
00277
00278
00279 NR = NR - 1
00280 J2 = J2 - KB1
00281 END IF
00282
00283 DO 40 J = J1, J2, KB1
00284
00285
00286
00287
00288 WORK( J+KUN ) = WORK( J )*AB( 1, J+KUN )
00289 AB( 1, J+KUN ) = WORK( MN+J )*AB( 1, J+KUN )
00290 40 CONTINUE
00291
00292
00293
00294
00295 IF( NR.GT.0 )
00296 $ CALL DLARGV( NR, AB( 1, J1+KUN-1 ), INCA,
00297 $ WORK( J1+KUN ), KB1, WORK( MN+J1+KUN ),
00298 $ KB1 )
00299
00300
00301
00302 DO 50 L = 1, KB
00303 IF( J2+L-1.GT.M ) THEN
00304 NRT = NR - 1
00305 ELSE
00306 NRT = NR
00307 END IF
00308 IF( NRT.GT.0 )
00309 $ CALL DLARTV( NRT, AB( L+1, J1+KUN-1 ), INCA,
00310 $ AB( L, J1+KUN ), INCA,
00311 $ WORK( MN+J1+KUN ), WORK( J1+KUN ),
00312 $ KB1 )
00313 50 CONTINUE
00314
00315 IF( ML.EQ.ML0 .AND. MU.GT.MU0 ) THEN
00316 IF( MU.LE.N-I+1 ) THEN
00317
00318
00319
00320
00321 CALL DLARTG( AB( KU-MU+3, I+MU-2 ),
00322 $ AB( KU-MU+2, I+MU-1 ),
00323 $ WORK( MN+I+MU-1 ), WORK( I+MU-1 ),
00324 $ RA )
00325 AB( KU-MU+3, I+MU-2 ) = RA
00326 CALL DROT( MIN( KL+MU-2, M-I ),
00327 $ AB( KU-MU+4, I+MU-2 ), 1,
00328 $ AB( KU-MU+3, I+MU-1 ), 1,
00329 $ WORK( MN+I+MU-1 ), WORK( I+MU-1 ) )
00330 END IF
00331 NR = NR + 1
00332 J1 = J1 - KB1
00333 END IF
00334
00335 IF( WANTPT ) THEN
00336
00337
00338
00339 DO 60 J = J1, J2, KB1
00340 CALL DROT( N, PT( J+KUN-1, 1 ), LDPT,
00341 $ PT( J+KUN, 1 ), LDPT, WORK( MN+J+KUN ),
00342 $ WORK( J+KUN ) )
00343 60 CONTINUE
00344 END IF
00345
00346 IF( J2+KB.GT.M ) THEN
00347
00348
00349
00350 NR = NR - 1
00351 J2 = J2 - KB1
00352 END IF
00353
00354 DO 70 J = J1, J2, KB1
00355
00356
00357
00358
00359 WORK( J+KB ) = WORK( J+KUN )*AB( KLU1, J+KUN )
00360 AB( KLU1, J+KUN ) = WORK( MN+J+KUN )*AB( KLU1, J+KUN )
00361 70 CONTINUE
00362
00363 IF( ML.GT.ML0 ) THEN
00364 ML = ML - 1
00365 ELSE
00366 MU = MU - 1
00367 END IF
00368 80 CONTINUE
00369 90 CONTINUE
00370 END IF
00371
00372 IF( KU.EQ.0 .AND. KL.GT.0 ) THEN
00373
00374
00375
00376
00377
00378
00379
00380 DO 100 I = 1, MIN( M-1, N )
00381 CALL DLARTG( AB( 1, I ), AB( 2, I ), RC, RS, RA )
00382 D( I ) = RA
00383 IF( I.LT.N ) THEN
00384 E( I ) = RS*AB( 1, I+1 )
00385 AB( 1, I+1 ) = RC*AB( 1, I+1 )
00386 END IF
00387 IF( WANTQ )
00388 $ CALL DROT( M, Q( 1, I ), 1, Q( 1, I+1 ), 1, RC, RS )
00389 IF( WANTC )
00390 $ CALL DROT( NCC, C( I, 1 ), LDC, C( I+1, 1 ), LDC, RC,
00391 $ RS )
00392 100 CONTINUE
00393 IF( M.LE.N )
00394 $ D( M ) = AB( 1, M )
00395 ELSE IF( KU.GT.0 ) THEN
00396
00397
00398
00399 IF( M.LT.N ) THEN
00400
00401
00402
00403
00404
00405 RB = AB( KU, M+1 )
00406 DO 110 I = M, 1, -1
00407 CALL DLARTG( AB( KU+1, I ), RB, RC, RS, RA )
00408 D( I ) = RA
00409 IF( I.GT.1 ) THEN
00410 RB = -RS*AB( KU, I )
00411 E( I-1 ) = RC*AB( KU, I )
00412 END IF
00413 IF( WANTPT )
00414 $ CALL DROT( N, PT( I, 1 ), LDPT, PT( M+1, 1 ), LDPT,
00415 $ RC, RS )
00416 110 CONTINUE
00417 ELSE
00418
00419
00420
00421 DO 120 I = 1, MINMN - 1
00422 E( I ) = AB( KU, I+1 )
00423 120 CONTINUE
00424 DO 130 I = 1, MINMN
00425 D( I ) = AB( KU+1, I )
00426 130 CONTINUE
00427 END IF
00428 ELSE
00429
00430
00431
00432
00433 DO 140 I = 1, MINMN - 1
00434 E( I ) = ZERO
00435 140 CONTINUE
00436 DO 150 I = 1, MINMN
00437 D( I ) = AB( 1, I )
00438 150 CONTINUE
00439 END IF
00440 RETURN
00441
00442
00443
00444 END