221 SUBROUTINE slasd3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
222 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
230 INTEGER INFO, K, LDQ, LDU, , LDVT, , NL, NR,
234 INTEGER CTOT( * ), IDXC( * )
235 REAL D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
236 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
243 REAL ONE, ZERO, NEGONE
244 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0,
248 INTEGER CTEMP, KTEMP, M, NLP2, NRP1
259 INTRINSIC abs, sign, sqrt
269 ELSE IF( nr.LT.1 )
THEN
271 ELSE IF( ( sqre.NE.1 ) .AND. ( sqre.NE.0 ) )
THEN
280 IF( ( k.LT.1 ) .OR. ( k.GT.n ) )
THEN
282 ELSE IF( ldq.LT.k )
THEN
284 ELSE IF( ldu.LT.n )
THEN
286 ELSE IF( ldu2.LT.n )
THEN
288 ELSE IF( ldvt.LT.m )
THEN
290 ELSE IF( ldvt2.LT.m )
THEN
294 CALL xerbla(
'SLASD3', -info )
301 d( 1 ) = abs( z( 1 ) )
302 CALL scopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
303 IF( z( 1 ).GT.zero )
THEN
304 CALL scopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
307 u( i, 1 ) = -u2( i, 1 )
331 dsigma( i ) = slamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
336 CALL scopy( k, z, 1, q, 1 )
340 rho = snrm2( k, z, 1 )
341 CALL slascl(
'G', 0, 0, rho, one, k, 1, z, k, info )
347 CALL slasd4( k, j, dsigma, z, u( 1, j ), rho, d( j ),
360 z( i ) = u( i, k )*vt( i, k )
362 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
363 $ ( dsigma( i )-dsigma( j ) ) /
364 $ ( dsigma( i )+dsigma( j ) ) )
367 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
368 $ ( dsigma( i )-dsigma( j+1 ) ) /
369 $ ( dsigma( i )+dsigma( j+1 ) ) )
371 z( i ) = sign( sqrt( abs( z( i ) ) ), q( i, 1 ) )
378 vt( 1, i ) = z( 1 ) / u( 1, i ) / vt( 1, i )
381 vt( j, i ) = z( j ) / u( j, i ) / vt( j, i )
382 u( j, i ) = dsigma( j )*vt( j, i )
384 temp = snrm2( k, u( 1, i ), 1 )
385 q( 1, i ) = u( 1, i ) / temp
388 q( j, i ) = u( jc, i ) / temp
395 CALL sgemm(
'N',
'N', n, k, k, one, u2, ldu2, q, ldq, zero, u,
399 IF( ctot( 1 ).GT.0 )
THEN
400 CALL sgemm(
'N',
'N', nl, k, ctot( 1 ), one, u2( 1, 2 ), ldu2,
401 $ q( 2, 1 ), ldq, zero, u( 1, 1 ), ldu )
402 IF( ctot( 3 ).GT.0 )
THEN
403 ktemp = 2 + ctot( 1 ) + ctot( 2 )
404 CALL sgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
405 $ ldu2, q( ktemp, 1 ), ldq, one, u( 1, 1 ), ldu )
407 ELSE IF( ctot( 3 ).GT.0 )
THEN
408 ktemp = 2 + ctot( 1 ) + ctot( 2 )
409 CALL sgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
410 $ ldu2, q( ktemp, 1 ), ldq, zero, u( 1, 1 ), ldu )
412 CALL slacpy(
'F', nl, k, u2, ldu2, u, ldu )
414 CALL scopy( k, q( 1, 1 ), ldq, u( nlp1, 1 ), ldu )
415 ktemp = 2 + ctot( 1 )
416 ctemp = ctot( 2 ) + ctot( 3 )
417 CALL sgemm(
'N',
'N', nr, k, ctemp, one, u2( nlp2, ktemp ), ldu2,
418 $ q( ktemp, 1 ), ldq, zero, u( nlp2, 1 ), ldu )
424 temp = snrm2( k, vt( 1, i ), 1 )
425 q( i, 1 ) = vt( 1, i ) / temp
428 q( i, j ) = vt( jc, i ) / temp
435 CALL sgemm(
'N',
'N', k, m, k, one, q, ldq, vt2, ldvt2, zero,
439 ktemp = 1 + ctot( 1 )
440 CALL sgemm(
'N',
'N', k, nlp1, ktemp, one, q( 1, 1 ), ldq,
441 $ vt2( 1, 1 ), ldvt2, zero, vt( 1, 1 ), ldvt )
442 ktemp = 2 + ctot( 1 ) + ctot( 2 )
444 $
CALL sgemm(
'N', 'n
', K, NLP1, CTOT( 3 ), ONE, Q( 1, KTEMP ),
445 $ LDQ, VT2( KTEMP, 1 ), LDVT2, ONE, VT( 1, 1 ),
448 KTEMP = CTOT( 1 ) + 1
450.GT.
IF( KTEMP1 ) THEN
452 Q( I, KTEMP ) = Q( I, 1 )
455 VT2( KTEMP, I ) = VT2( 1, I )
458 CTEMP = 1 + CTOT( 2 ) + CTOT( 3 )
459 CALL SGEMM( 'n
', 'n
', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
460 $ VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )