90 REAL FUNCTION sqrt12( M, N, A, LDA, S, WORK, LWORK )
98 INTEGER LDA, LWORK, M, N
101 REAL A( lda, * ), S( * ), WORK( lwork )
108 parameter( zero = 0.0e0, one = 1.0e0 )
111 INTEGER I, INFO, ISCL, J, MN
112 REAL ANRM, BIGNUM, NRMSVL, SMLNUM
115 REAL SASUM, SLAMCH, SLANGE, SNRM2
116 EXTERNAL sasum, slamch, slange, snrm2
123 INTRINSIC max, min, real
134 IF( lwork.LT.max( m*n+4*min( m, n )+max( m, n ),
135 $ m*n+2*min( m, n )+4*n) )
THEN 136 CALL xerbla(
'SQRT12', 7 )
146 nrmsvl = snrm2( mn, s, 1 )
150 CALL slaset(
'Full', m, n, zero, zero, work, m )
152 DO 10 i = 1, min( j, m )
153 work( ( j-1 )*m+i ) = a( i, j )
159 smlnum = slamch(
'S' ) / slamch(
'P' )
160 bignum = one / smlnum
161 CALL slabad( smlnum, bignum )
165 anrm = slange(
'M', m, n, work, m, dummy )
167 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 171 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, work, m, info )
173 ELSE IF( anrm.GT.bignum )
THEN 177 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, work, m, info )
181 IF( anrm.NE.zero )
THEN 185 CALL sgebd2( m, n, work, m, work( m*n+1 ), work( m*n+mn+1 ),
186 $ work( m*n+2*mn+1 ), work( m*n+3*mn+1 ),
187 $ work( m*n+4*mn+1 ), info )
188 CALL sbdsqr(
'Upper', mn, 0, 0, 0, work( m*n+1 ),
189 $ work( m*n+mn+1 ), dummy, mn, dummy, 1, dummy, mn,
190 $ work( m*n+2*mn+1 ), info )
193 IF( anrm.GT.bignum )
THEN 194 CALL slascl(
'G', 0, 0, bignum, anrm, mn, 1,
195 $ work( m*n+1 ), mn, info )
197 IF( anrm.LT.smlnum )
THEN 198 CALL slascl(
'G', 0, 0, smlnum, anrm, mn, 1,
199 $ work( m*n+1 ), mn, info )
212 CALL saxpy( mn, -one, s, 1, work( m*n+1 ), 1 )
213 sqrt12 = sasum( mn, work( m*n+1 ), 1 ) /
214 $ ( slamch(
'Epsilon' )*
REAL( MAX( M, N ) ) )
subroutine sbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
SBDSQR
real function sqrt12(M, N, A, LDA, S, WORK, LWORK)
SQRT12
subroutine sgebd2(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO)
SGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
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 saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine slabad(SMALL, LARGE)
SLABAD