223 SUBROUTINE slasd3( 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 REAL D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
239 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
246 REAL ONE, ZERO, NEGONE
247 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0,
251 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
256 EXTERNAL SLAMC3, SNRM2
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(
'SLASD3', -info )
304 d( 1 ) = abs( z( 1 ) )
305 CALL scopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
306 IF( z( 1 ).GT.zero )
THEN
307 CALL scopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
310 u( i, 1 ) = -u2( i, 1 )
334 dsigma( i ) = slamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
339 CALL scopy( k, z, 1, q, 1 )
343 rho = snrm2( k, z, 1 )
344 CALL slascl(
'G', 0, 0, rho, one, k, 1, z, k, info )
350 CALL slasd4( 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 = snrm2( k, u( 1, i ), 1 )
388 q( 1, i ) = u( 1, i ) / temp
391 q( j, i ) = u( jc, i ) / temp
398 CALL sgemm(
'N',
'N', n, k, k, one, u2, ldu2, q, ldq, zero, u,
402 IF( ctot( 1 ).GT.0 )
THEN
403 CALL sgemm(
'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 sgemm(
'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 sgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
413 $ ldu2, q( ktemp, 1 ), ldq, zero, u( 1, 1 ), ldu )
415 CALL slacpy(
'F', nl, k, u2, ldu2, u, ldu )
417 CALL scopy( k, q( 1, 1 ), ldq, u( nlp1, 1 ), ldu )
418 ktemp = 2 + ctot( 1 )
419 ctemp = ctot( 2 ) + ctot( 3 )
420 CALL sgemm(
'N',
'N', nr, k, ctemp, one, u2( nlp2, ktemp ), ldu2,
421 $ q( ktemp, 1 ), ldq, zero, u( nlp2, 1 ), ldu )
427 temp = snrm2( k, vt( 1, i ), 1 )
428 q( i, 1 ) = vt( 1, i ) / temp
431 q( i, j ) = vt( jc, i ) / temp
438 CALL sgemm(
'N',
'N', k, m, k, one, q, ldq, vt2, ldvt2, zero,
442 ktemp = 1 + ctot( 1 )
443 CALL sgemm(
'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 sgemm(
'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 sgemm(
'N',
'N', k, nrp1, ctemp, one, q( 1, ktemp ), ldq,
463 $ vt2( ktemp, nlp2 ), ldvt2, zero, vt( 1, nlp2 ), ldvt )