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 )
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slasd3(NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2, LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z, INFO)
SLASD3 finds all square roots of the roots of the secular equation, as defined by the values in D and...
subroutine slasd4(N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO)
SLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one modif...
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY