88 REAL function
sqrt12( m, n, a, lda, s, work, lwork )
95 INTEGER lda, lwork, m, n
98 REAL a( lda, * ), s( * ), work( lwork )
105 parameter( zero = 0.0e0, one = 1.0e0 )
108 INTEGER i, info, iscl, j, mn
109 REAL anrm, bignum, nrmsvl, smlnum
120 INTRINSIC max, min, real
131 IF( lwork.LT.max( m*n+4*min( m, n )+max( m, n ),
132 $ m*n+2*min( m, n )+4*n) )
THEN
133 CALL xerbla(
'SQRT12', 7 )
143 nrmsvl =
snrm2( mn, s, 1 )
147 CALL slaset(
'Full', m, n, zero, zero, work, m )
149 DO 10 i = 1, min( j, m )
150 work( ( j-1 )*m+i ) = a( i, j )
157 bignum = one / smlnum
158 CALL slabad( smlnum, bignum )
162 anrm =
slange(
'M', m, n, work, m, dummy )
164 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
168 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, work, m, info )
170 ELSE IF( anrm.GT.bignum )
THEN
174 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, work, m, info )
178 IF( anrm.NE.zero )
THEN
182 CALL sgebd2( m, n, work, m, work( m*n+1 ), work( m*n+mn+1 ),
183 $ work( m*n+2*mn+1 ), work( m*n+3*mn+1 ),
184 $ work( m*n+4*mn+1 ), info )
185 CALL sbdsqr(
'Upper', mn, 0, 0, 0, work( m*n+1 ),
186 $ work( m*n+mn+1 ), dummy, mn, dummy, 1, dummy, mn,
187 $ work( m*n+2*mn+1 ), info )
190 IF( anrm.GT.bignum )
THEN
191 CALL slascl(
'G', 0, 0, bignum, anrm, mn, 1,
192 $ work( m*n+1 ), mn, info )
194 IF( anrm.LT.smlnum )
THEN
195 CALL slascl(
'G', 0, 0, smlnum, anrm, mn, 1,
196 $ work( m*n+1 ), mn, info )
209 CALL saxpy( mn, -one, s, 1, work( m*n+1 ), 1 )
211 $ (
slamch(
'Epsilon' )*real( max( m, n ) ) )
subroutine slabad(SMALL, LARGE)
SLABAD
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 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 xerbla(SRNAME, INFO)
XERBLA
subroutine sbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
SBDSQR
real function slange(NORM, M, N, A, LDA, WORK)
SLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine sgebd2(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO)
SGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm.
real(wp) function snrm2(n, x, incx)
SNRM2
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
real function sasum(N, SX, INCX)
SASUM
real function sqrt12(M, N, A, LDA, S, WORK, LWORK)
SQRT12
real function slamch(CMACH)
SLAMCH