223 SUBROUTINE dlasd3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
224 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
233 INTEGER INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
237 INTEGER CTOT( * ), IDXC( * )
238 DOUBLE PRECISION D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
239 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
246 DOUBLE PRECISION ONE, ZERO, NEGONE
247 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0,
251 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
252 DOUBLE PRECISION RHO, TEMP
255 DOUBLE PRECISION DLAMC3, DNRM2
256 EXTERNAL DLAMC3, DNRM2
262 INTRINSIC abs, sign, sqrt
272 ELSE IF( nr.LT.1 )
THEN
274 ELSE IF( ( sqre.NE.1 ) .AND. ( sqre.NE.0 ) )
THEN
283 IF( ( k.LT.1 ) .OR. ( k.GT.n ) )
THEN
285 ELSE IF( ldq.LT.k )
THEN
287 ELSE IF( ldu.LT.n )
THEN
289 ELSE IF( ldu2.LT.n )
THEN
291 ELSE IF( ldvt.LT.m )
THEN
293 ELSE IF( ldvt2.LT.m )
THEN
297 CALL xerbla(
'DLASD3', -info )
304 d( 1 ) = abs( z( 1 ) )
305 CALL dcopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
306 IF( z( 1 ).GT.zero )
THEN
307 CALL dcopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
310 u( i, 1 ) = -u2( i, 1 )
334 dsigma( i ) = dlamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
339 CALL dcopy( k, z, 1, q, 1 )
343 rho = dnrm2( k, z, 1 )
344 CALL dlascl(
'G', 0, 0, rho, one, k, 1, z, k, info )
350 CALL dlasd4( k, j, dsigma, z, u( 1, j ), rho, d( j ),
363 z( i ) = u( i, k )*vt( i, k )
365 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
366 $ ( dsigma( i )-dsigma( j ) ) /
367 $ ( dsigma( i )+dsigma( j ) ) )
370 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
371 $ ( dsigma( i )-dsigma( j+1 ) ) /
372 $ ( dsigma( i )+dsigma( j+1 ) ) )
374 z( i ) = sign( sqrt( abs( z( i ) ) ), q( i, 1 ) )
381 vt( 1, i ) = z( 1 ) / u( 1, i ) / vt( 1, i )
384 vt( j, i ) = z( j ) / u( j, i ) / vt( j, i )
385 u( j, i ) = dsigma( j )*vt( j, i )
387 temp = dnrm2( k, u( 1, i ), 1 )
388 q( 1, i ) = u( 1, i ) / temp
391 q( j, i ) = u( jc, i ) / temp
398 CALL dgemm(
'N',
'N', n, k, k, one, u2, ldu2, q, ldq, zero, u,
402 IF( ctot( 1 ).GT.0 )
THEN
403 CALL dgemm(
'N',
'N', nl, k, ctot( 1 ), one, u2( 1, 2 ), ldu2,
404 $ q( 2, 1 ), ldq, zero, u( 1, 1 ), ldu )
405 IF( ctot( 3 ).GT.0 )
THEN
406 ktemp = 2 + ctot( 1 ) + ctot( 2 )
407 CALL dgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
408 $ ldu2, q( ktemp, 1 ), ldq, one, u( 1, 1 ), ldu )
410 ELSE IF( ctot( 3 ).GT.0 )
THEN
411 ktemp = 2 + ctot( 1 ) + ctot( 2 )
412 CALL dgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
413 $ ldu2, q( ktemp, 1 ), ldq, zero, u( 1, 1 ), ldu )
415 CALL dlacpy(
'F', nl, k, u2, ldu2, u, ldu )
417 CALL dcopy( k, q( 1, 1 ), ldq, u( nlp1, 1 ), ldu )
418 ktemp = 2 + ctot( 1 )
419 ctemp = ctot( 2 ) + ctot( 3 )
420 CALL dgemm(
'N',
'N', nr, k, ctemp, one, u2( nlp2, ktemp ), ldu2,
421 $ q( ktemp, 1 ), ldq, zero, u( nlp2, 1 ), ldu )
427 temp = dnrm2( k, vt( 1, i ), 1 )
428 q( i, 1 ) = vt( 1, i ) / temp
431 q( i, j ) = vt( jc, i ) / temp
438 CALL dgemm(
'N',
'N', k, m, k, one, q, ldq, vt2, ldvt2, zero,
442 ktemp = 1 + ctot( 1 )
443 CALL dgemm(
'N',
'N', k, nlp1, ktemp, one, q( 1, 1 ), ldq,
444 $ vt2( 1, 1 ), ldvt2, zero, vt( 1, 1 ), ldvt )
445 ktemp = 2 + ctot( 1 ) + ctot( 2 )
447 $
CALL dgemm(
'N',
'N', k, nlp1, ctot( 3 ), one, q( 1, ktemp ),
448 $ ldq, vt2( ktemp, 1 ), ldvt2, one, vt( 1, 1 ),
451 ktemp = ctot( 1 ) + 1
453 IF( ktemp.GT.1 )
THEN
455 q( i, ktemp ) = q( i, 1 )
458 vt2( ktemp, i ) = vt2( 1, i )
461 ctemp = 1 + ctot( 2 ) + ctot( 3 )
462 CALL dgemm(
'N',
'N', k, nrp1, ctemp, one, q( 1, ktemp ), ldq,
463 $ vt2( ktemp, nlp2 ), ldvt2, zero, vt( 1, nlp2 ), ldvt )