1 SUBROUTINE dqrt15( 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
10 DOUBLE PRECISION norma, normb
14 DOUBLE PRECISION a( lda, * ), b( ldb, * ), s( * ), work( lwork )
80 DOUBLE PRECISION zero, one, two, svmin
81 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0,
86 DOUBLE PRECISION bignum, eps, smlnum, temp
89 DOUBLE PRECISION dummy( 1 )
92 DOUBLE PRECISION dasum, dlamch, dlange,
dlarnd, dnrm2
93 EXTERNAL dasum, dlamch, dlange,
dlarnd, dnrm2
105 IF( lwork.LT.
max( m+mn, mn*nrhs, 2*n+m ) )
THEN
106 CALL
xerbla(
'DQRT15', 16 )
110 smlnum = dlamch(
'Safe minimum' )
111 bignum = one / smlnum
112 eps = dlamch(
'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(
'DQRT15', 2 )
137 IF( temp.GT.svmin )
THEN
143 CALL
dlaord(
'Decreasing', rank, s, 1 )
147 CALL dlarnv( 2, iseed, m, work )
148 CALL dscal( m, one / dnrm2( m, work, 1 ), work, 1 )
149 CALL
dlaset(
'Full', m, rank, zero, one, a, lda )
150 CALL dlarf(
'Left', m, rank, work, 1, two, a, lda,
157 CALL dlarnv( 2, iseed, rank*nrhs, work )
158 CALL dgemm(
'No transpose',
'No transpose', m, nrhs, rank, one,
159 $ a, lda, work, rank, zero, b, ldb )
166 CALL dscal( m, s( j ), a( 1, j ), 1 )
169 $ CALL
dlaset(
'Full', m, n-rank, zero, zero, a( 1, rank+1 ),
171 CALL
dlaror(
'Right',
'No initialization', m, n, a, lda, iseed,
183 CALL
dlaset(
'Full', m, n, zero, zero, a, lda )
184 CALL
dlaset(
'Full', m, nrhs, zero, zero, b, ldb )
190 IF( scale.NE.1 )
THEN
191 norma = dlange(
'Max', m, n, a, lda, dummy )
192 IF( norma.NE.zero )
THEN
193 IF( scale.EQ.2 )
THEN
197 CALL
dlascl(
'General', 0, 0, norma, bignum, m, n, a,
199 CALL
dlascl(
'General', 0, 0, norma, bignum, mn, 1, s,
201 CALL
dlascl(
'General', 0, 0, norma, bignum, m, nrhs, b,
203 ELSE IF( scale.EQ.3 )
THEN
207 CALL
dlascl(
'General', 0, 0, norma, smlnum, m, n, a,
209 CALL
dlascl(
'General', 0, 0, norma, smlnum, mn, 1, s,
211 CALL
dlascl(
'General', 0, 0, norma, smlnum, m, nrhs, b,
214 CALL
xerbla(
'DQRT15', 1 )
220 norma = dasum( mn, s, 1 )
221 normb = dlange(
'One-norm', m, nrhs, b, ldb, dummy )