00001 SUBROUTINE DLASD3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
00002 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
00003 $ INFO )
00004
00005
00006
00007
00008
00009
00010
00011 INTEGER INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
00012 $ SQRE
00013
00014
00015 INTEGER CTOT( * ), IDXC( * )
00016 DOUBLE PRECISION D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
00017 $ U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ),
00018 $ Z( * )
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
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 DOUBLE PRECISION ONE, ZERO, NEGONE
00137 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0,
00138 $ NEGONE = -1.0D+0 )
00139
00140
00141 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
00142 DOUBLE PRECISION RHO, TEMP
00143
00144
00145 DOUBLE PRECISION DLAMC3, DNRM2
00146 EXTERNAL DLAMC3, DNRM2
00147
00148
00149 EXTERNAL DCOPY, DGEMM, DLACPY, DLASCL, DLASD4, XERBLA
00150
00151
00152 INTRINSIC ABS, SIGN, SQRT
00153
00154
00155
00156
00157
00158 INFO = 0
00159
00160 IF( NL.LT.1 ) THEN
00161 INFO = -1
00162 ELSE IF( NR.LT.1 ) THEN
00163 INFO = -2
00164 ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN
00165 INFO = -3
00166 END IF
00167
00168 N = NL + NR + 1
00169 M = N + SQRE
00170 NLP1 = NL + 1
00171 NLP2 = NL + 2
00172
00173 IF( ( K.LT.1 ) .OR. ( K.GT.N ) ) THEN
00174 INFO = -4
00175 ELSE IF( LDQ.LT.K ) THEN
00176 INFO = -7
00177 ELSE IF( LDU.LT.N ) THEN
00178 INFO = -10
00179 ELSE IF( LDU2.LT.N ) THEN
00180 INFO = -12
00181 ELSE IF( LDVT.LT.M ) THEN
00182 INFO = -14
00183 ELSE IF( LDVT2.LT.M ) THEN
00184 INFO = -16
00185 END IF
00186 IF( INFO.NE.0 ) THEN
00187 CALL XERBLA( 'DLASD3', -INFO )
00188 RETURN
00189 END IF
00190
00191
00192
00193 IF( K.EQ.1 ) THEN
00194 D( 1 ) = ABS( Z( 1 ) )
00195 CALL DCOPY( M, VT2( 1, 1 ), LDVT2, VT( 1, 1 ), LDVT )
00196 IF( Z( 1 ).GT.ZERO ) THEN
00197 CALL DCOPY( N, U2( 1, 1 ), 1, U( 1, 1 ), 1 )
00198 ELSE
00199 DO 10 I = 1, N
00200 U( I, 1 ) = -U2( I, 1 )
00201 10 CONTINUE
00202 END IF
00203 RETURN
00204 END IF
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 DO 20 I = 1, K
00224 DSIGMA( I ) = DLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I )
00225 20 CONTINUE
00226
00227
00228
00229 CALL DCOPY( K, Z, 1, Q, 1 )
00230
00231
00232
00233 RHO = DNRM2( K, Z, 1 )
00234 CALL DLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
00235 RHO = RHO*RHO
00236
00237
00238
00239 DO 30 J = 1, K
00240 CALL DLASD4( K, J, DSIGMA, Z, U( 1, J ), RHO, D( J ),
00241 $ VT( 1, J ), INFO )
00242
00243
00244
00245 IF( INFO.NE.0 ) THEN
00246 RETURN
00247 END IF
00248 30 CONTINUE
00249
00250
00251
00252 DO 60 I = 1, K
00253 Z( I ) = U( I, K )*VT( I, K )
00254 DO 40 J = 1, I - 1
00255 Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
00256 $ ( DSIGMA( I )-DSIGMA( J ) ) /
00257 $ ( DSIGMA( I )+DSIGMA( J ) ) )
00258 40 CONTINUE
00259 DO 50 J = I, K - 1
00260 Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
00261 $ ( DSIGMA( I )-DSIGMA( J+1 ) ) /
00262 $ ( DSIGMA( I )+DSIGMA( J+1 ) ) )
00263 50 CONTINUE
00264 Z( I ) = SIGN( SQRT( ABS( Z( I ) ) ), Q( I, 1 ) )
00265 60 CONTINUE
00266
00267
00268
00269
00270 DO 90 I = 1, K
00271 VT( 1, I ) = Z( 1 ) / U( 1, I ) / VT( 1, I )
00272 U( 1, I ) = NEGONE
00273 DO 70 J = 2, K
00274 VT( J, I ) = Z( J ) / U( J, I ) / VT( J, I )
00275 U( J, I ) = DSIGMA( J )*VT( J, I )
00276 70 CONTINUE
00277 TEMP = DNRM2( K, U( 1, I ), 1 )
00278 Q( 1, I ) = U( 1, I ) / TEMP
00279 DO 80 J = 2, K
00280 JC = IDXC( J )
00281 Q( J, I ) = U( JC, I ) / TEMP
00282 80 CONTINUE
00283 90 CONTINUE
00284
00285
00286
00287 IF( K.EQ.2 ) THEN
00288 CALL DGEMM( 'N', 'N', N, K, K, ONE, U2, LDU2, Q, LDQ, ZERO, U,
00289 $ LDU )
00290 GO TO 100
00291 END IF
00292 IF( CTOT( 1 ).GT.0 ) THEN
00293 CALL DGEMM( 'N', 'N', NL, K, CTOT( 1 ), ONE, U2( 1, 2 ), LDU2,
00294 $ Q( 2, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
00295 IF( CTOT( 3 ).GT.0 ) THEN
00296 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
00297 CALL DGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
00298 $ LDU2, Q( KTEMP, 1 ), LDQ, ONE, U( 1, 1 ), LDU )
00299 END IF
00300 ELSE IF( CTOT( 3 ).GT.0 ) THEN
00301 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
00302 CALL DGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
00303 $ LDU2, Q( KTEMP, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
00304 ELSE
00305 CALL DLACPY( 'F', NL, K, U2, LDU2, U, LDU )
00306 END IF
00307 CALL DCOPY( K, Q( 1, 1 ), LDQ, U( NLP1, 1 ), LDU )
00308 KTEMP = 2 + CTOT( 1 )
00309 CTEMP = CTOT( 2 ) + CTOT( 3 )
00310 CALL DGEMM( 'N', 'N', NR, K, CTEMP, ONE, U2( NLP2, KTEMP ), LDU2,
00311 $ Q( KTEMP, 1 ), LDQ, ZERO, U( NLP2, 1 ), LDU )
00312
00313
00314
00315 100 CONTINUE
00316 DO 120 I = 1, K
00317 TEMP = DNRM2( K, VT( 1, I ), 1 )
00318 Q( I, 1 ) = VT( 1, I ) / TEMP
00319 DO 110 J = 2, K
00320 JC = IDXC( J )
00321 Q( I, J ) = VT( JC, I ) / TEMP
00322 110 CONTINUE
00323 120 CONTINUE
00324
00325
00326
00327 IF( K.EQ.2 ) THEN
00328 CALL DGEMM( 'N', 'N', K, M, K, ONE, Q, LDQ, VT2, LDVT2, ZERO,
00329 $ VT, LDVT )
00330 RETURN
00331 END IF
00332 KTEMP = 1 + CTOT( 1 )
00333 CALL DGEMM( 'N', 'N', K, NLP1, KTEMP, ONE, Q( 1, 1 ), LDQ,
00334 $ VT2( 1, 1 ), LDVT2, ZERO, VT( 1, 1 ), LDVT )
00335 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
00336 IF( KTEMP.LE.LDVT2 )
00337 $ CALL DGEMM( 'N', 'N', K, NLP1, CTOT( 3 ), ONE, Q( 1, KTEMP ),
00338 $ LDQ, VT2( KTEMP, 1 ), LDVT2, ONE, VT( 1, 1 ),
00339 $ LDVT )
00340
00341 KTEMP = CTOT( 1 ) + 1
00342 NRP1 = NR + SQRE
00343 IF( KTEMP.GT.1 ) THEN
00344 DO 130 I = 1, K
00345 Q( I, KTEMP ) = Q( I, 1 )
00346 130 CONTINUE
00347 DO 140 I = NLP2, M
00348 VT2( KTEMP, I ) = VT2( 1, I )
00349 140 CONTINUE
00350 END IF
00351 CTEMP = 1 + CTOT( 2 ) + CTOT( 3 )
00352 CALL DGEMM( 'N', 'N', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
00353 $ VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )
00354
00355 RETURN
00356
00357
00358
00359 END