1 SUBROUTINE cqrt15( 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
15 COMPLEX a( lda, * ), b( ldb, * ), work( lwork )
81 REAL zero, one, two, svmin
82 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0,
85 parameter( czero = ( 0.0e+0, 0.0e+0 ),
86 $ cone = ( 1.0e+0, 0.0e+0 ) )
90 REAL bignum, eps, smlnum, temp
96 REAL clange, sasum, scnrm2, slamch,
slarnd
97 EXTERNAL clange, sasum, scnrm2, slamch,
slarnd
104 INTRINSIC abs, cmplx,
max,
min
109 IF( lwork.LT.
max( m+mn, mn*nrhs, 2*n+m ) )
THEN
110 CALL
xerbla(
'CQRT15', 16 )
114 smlnum = slamch(
'Safe minimum' )
115 bignum = one / smlnum
116 CALL
slabad( smlnum, bignum )
117 eps = slamch(
'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(
'CQRT15', 2 )
142 IF( temp.GT.svmin )
THEN
148 CALL
slaord(
'Decreasing', rank, s, 1 )
152 CALL clarnv( 2, iseed, m, work )
153 CALL csscal( m, one / scnrm2( m, work, 1 ), work, 1 )
154 CALL
claset(
'Full', m, rank, czero, cone, a, lda )
155 CALL clarf(
'Left', m, rank, work, 1, cmplx( two ), a, lda,
162 CALL clarnv( 2, iseed, rank*nrhs, work )
163 CALL cgemm(
'No transpose',
'No transpose', m, nrhs, rank,
164 $ cone, a, lda, work, rank, czero, b, ldb )
171 CALL csscal( m, s( j ), a( 1, j ), 1 )
174 $ CALL
claset(
'Full', m, n-rank, czero, czero,
175 $ a( 1, rank+1 ), lda )
176 CALL
claror(
'Right',
'No initialization', m, n, a, lda, iseed,
188 CALL
claset(
'Full', m, n, czero, czero, a, lda )
189 CALL
claset(
'Full', m, nrhs, czero, czero, b, ldb )
195 IF( scale.NE.1 )
THEN
196 norma = clange(
'Max', m, n, a, lda, dummy )
197 IF( norma.NE.zero )
THEN
198 IF( scale.EQ.2 )
THEN
202 CALL
clascl(
'General', 0, 0, norma, bignum, m, n, a,
204 CALL
slascl(
'General', 0, 0, norma, bignum, mn, 1, s,
206 CALL
clascl(
'General', 0, 0, norma, bignum, m, nrhs, b,
208 ELSE IF( scale.EQ.3 )
THEN
212 CALL
clascl(
'General', 0, 0, norma, smlnum, m, n, a,
214 CALL
slascl(
'General', 0, 0, norma, smlnum, mn, 1, s,
216 CALL
clascl(
'General', 0, 0, norma, smlnum, m, nrhs, b,
219 CALL
xerbla(
'CQRT15', 1 )
225 norma = sasum( mn, s, 1 )
226 normb = clange(
'One-norm', m, nrhs, b, ldb, dummy )