1 SUBROUTINE sqrt15( SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S,
2 $ rank, norma, normb, iseed, work, lwork )
9 INTEGER lda, ldb, lwork, m, n, nrhs, rank, rksel, scale
14 REAL a( lda, * ), b( ldb, * ), s( * ), work( lwork )
80 REAL zero, one, two, svmin
81 parameter( zero = 0.0e0, one = 1.0e0, two = 2.0e0,
86 REAL bignum, eps, smlnum, temp
92 REAL sasum, slamch, slange,
slarnd, snrm2
93 EXTERNAL sasum, slamch, slange,
slarnd, snrm2
105 IF( lwork.LT.
max( m+mn, mn*nrhs, 2*n+m ) )
THEN
106 CALL
xerbla(
'SQRT15', 16 )
110 smlnum = slamch(
'Safe minimum' )
111 bignum = one / smlnum
112 eps = slamch(
'Epsilon' )
113 smlnum = ( smlnum / eps ) / eps
114 bignum = one / smlnum
118 IF( rksel.EQ.1 )
THEN
120 ELSE IF( rksel.EQ.2 )
THEN
122 DO 10 j = rank + 1, mn
126 CALL
xerbla(
'SQRT15', 2 )
137 IF( temp.GT.svmin )
THEN
143 CALL
slaord(
'Decreasing', rank, s, 1 )
147 CALL slarnv( 2, iseed, m, work )
148 CALL sscal( m, one / snrm2( m, work, 1 ), work, 1 )
149 CALL
slaset(
'Full', m, rank, zero, one, a, lda )
150 CALL slarf(
'Left', m, rank, work, 1, two, a, lda,
157 CALL slarnv( 2, iseed, rank*nrhs, work )
158 CALL sgemm(
'No transpose',
'No transpose', m, nrhs, rank, one,
159 $ a, lda, work, rank, zero, b, ldb )
166 CALL sscal( m, s( j ), a( 1, j ), 1 )
169 $ CALL
slaset(
'Full', m, n-rank, zero, zero, a( 1, rank+1 ),
171 CALL
slaror(
'Right',
'No initialization', m, n, a, lda, iseed,
183 CALL
slaset(
'Full', m, n, zero, zero, a, lda )
184 CALL
slaset(
'Full', m, nrhs, zero, zero, b, ldb )
190 IF( scale.NE.1 )
THEN
191 norma = slange(
'Max', m, n, a, lda, dummy )
192 IF( norma.NE.zero )
THEN
193 IF( scale.EQ.2 )
THEN
197 CALL
slascl(
'General', 0, 0, norma, bignum, m, n, a,
199 CALL
slascl(
'General', 0, 0, norma, bignum, mn, 1, s,
201 CALL
slascl(
'General', 0, 0, norma, bignum, m, nrhs, b,
203 ELSE IF( scale.EQ.3 )
THEN
207 CALL
slascl(
'General', 0, 0, norma, smlnum, m, n, a,
209 CALL
slascl(
'General', 0, 0, norma, smlnum, mn, 1, s,
211 CALL
slascl(
'General', 0, 0, norma, smlnum, m, nrhs, b,
214 CALL
xerbla(
'SQRT15', 1 )
220 norma = sasum( mn, s, 1 )
221 normb = slange(
'One-norm', m, nrhs, b, ldb, dummy )