1 SUBROUTINE zqrt15( 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 s( * )
15 COMPLEX*16 a( lda, * ), b( ldb, * ), work( lwork )
81 DOUBLE PRECISION zero, one, two, svmin
82 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0,
84 COMPLEX*16 czero, cone
85 parameter( czero = ( 0.0d+0, 0.0d+0 ),
86 $ cone = ( 1.0d+0, 0.0d+0 ) )
90 DOUBLE PRECISION bignum, eps, smlnum, temp
93 DOUBLE PRECISION dummy( 1 )
96 DOUBLE PRECISION dasum, dlamch,
dlarnd, dznrm2, zlange
97 EXTERNAL dasum, dlamch,
dlarnd, dznrm2, zlange
104 INTRINSIC abs, dcmplx,
max,
min
109 IF( lwork.LT.
max( m+mn, mn*nrhs, 2*n+m ) )
THEN
110 CALL
xerbla(
'ZQRT15', 16 )
114 smlnum = dlamch(
'Safe minimum' )
115 bignum = one / smlnum
116 CALL
dlabad( smlnum, bignum )
117 eps = dlamch(
'Epsilon' )
118 smlnum = ( smlnum / eps ) / eps
119 bignum = one / smlnum
123 IF( rksel.EQ.1 )
THEN
125 ELSE IF( rksel.EQ.2 )
THEN
127 DO 10 j = rank + 1, mn
131 CALL
xerbla(
'ZQRT15', 2 )
142 IF( temp.GT.svmin )
THEN
148 CALL
dlaord(
'Decreasing', rank, s, 1 )
152 CALL zlarnv( 2, iseed, m, work )
153 CALL zdscal( m, one / dznrm2( m, work, 1 ), work, 1 )
154 CALL
zlaset(
'Full', m, rank, czero, cone, a, lda )
155 CALL zlarf(
'Left', m, rank, work, 1, dcmplx( two ), a, lda,
162 CALL zlarnv( 2, iseed, rank*nrhs, work )
163 CALL zgemm(
'No transpose',
'No transpose', m, nrhs, rank,
164 $ cone, a, lda, work, rank, czero, b, ldb )
171 CALL zdscal( m, s( j ), a( 1, j ), 1 )
174 $ CALL
zlaset(
'Full', m, n-rank, czero, czero,
175 $ a( 1, rank+1 ), lda )
176 CALL
zlaror(
'Right',
'No initialization', m, n, a, lda, iseed,
188 CALL
zlaset(
'Full', m, n, czero, czero, a, lda )
189 CALL
zlaset(
'Full', m, nrhs, czero, czero, b, ldb )
195 IF( scale.NE.1 )
THEN
196 norma = zlange(
'Max', m, n, a, lda, dummy )
197 IF( norma.NE.zero )
THEN
198 IF( scale.EQ.2 )
THEN
202 CALL
zlascl(
'General', 0, 0, norma, bignum, m, n, a,
204 CALL
dlascl(
'General', 0, 0, norma, bignum, mn, 1, s,
206 CALL
zlascl(
'General', 0, 0, norma, bignum, m, nrhs, b,
208 ELSE IF( scale.EQ.3 )
THEN
212 CALL
zlascl(
'General', 0, 0, norma, smlnum, m, n, a,
214 CALL
dlascl(
'General', 0, 0, norma, smlnum, mn, 1, s,
216 CALL
zlascl(
'General', 0, 0, norma, smlnum, m, nrhs, b,
219 CALL
xerbla(
'ZQRT15', 1 )
225 norma = dasum( mn, s, 1 )
226 normb = zlange(
'One-norm', m, nrhs, b, ldb, dummy )