147 SUBROUTINE zqrt15( SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S,
148 $ RANK, NORMA, NORMB, ISEED, WORK, LWORK )
155 INTEGER LDA, LDB, LWORK, M, N, NRHS, RANK, RKSEL, SCALE
156 DOUBLE PRECISION NORMA, NORMB
160 DOUBLE PRECISION S( * )
161 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( LWORK )
167 DOUBLE PRECISION ZERO, ONE, TWO, SVMIN
168 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0,
170 COMPLEX*16 CZERO, CONE
171 parameter( czero = ( 0.0d+0, 0.0d+0 ),
172 $ cone = ( 1.0d+0, 0.0d+0 ) )
176 DOUBLE PRECISION BIGNUM, EPS, SMLNUM, TEMP
179 DOUBLE PRECISION DUMMY( 1 )
182 DOUBLE PRECISION DASUM, DLAMCH, DLARND, DZNRM2, ZLANGE
183 EXTERNAL dasum, dlamch, dlarnd, dznrm2, zlange
190 INTRINSIC abs, dcmplx, max, min
195 IF( lwork.LT.max( m+mn, mn*nrhs, 2*n+m ) )
THEN
196 CALL xerbla(
'ZQRT15', 16 )
200 smlnum = dlamch(
'Safe minimum' )
201 bignum = one / smlnum
202 CALL dlabad( smlnum, bignum )
203 eps = dlamch(
'Epsilon' )
204 smlnum = ( smlnum / eps ) / eps
205 bignum = one / smlnum
209 IF( rksel.EQ.1 )
THEN
211 ELSE IF( rksel.EQ.2 )
THEN
213 DO 10 j = rank + 1, mn
217 CALL xerbla(
'ZQRT15', 2 )
227 temp = dlarnd( 1, iseed )
228 IF( temp.GT.svmin )
THEN
234 CALL dlaord(
'Decreasing', rank, s, 1 )
238 CALL zlarnv( 2, iseed, m, work )
239 CALL zdscal( m, one / dznrm2( m, work, 1 ), work, 1 )
240 CALL zlaset(
'Full', m, rank, czero, cone, a, lda )
241 CALL zlarf(
'Left', m, rank, work, 1, dcmplx( two ), a, lda,
248 CALL zlarnv( 2, iseed, rank*nrhs, work )
249 CALL zgemm(
'No transpose',
'No transpose', m, nrhs, rank,
250 $ cone, a, lda, work, rank, czero, b, ldb )
257 CALL zdscal( m, s( j ), a( 1, j ), 1 )
260 $
CALL zlaset(
'Full', m, n-rank, czero, czero,
261 $ a( 1, rank+1 ), lda )
262 CALL zlaror(
'Right',
'No initialization', m, n, a, lda, iseed,
274 CALL zlaset(
'Full', m, n, czero, czero, a, lda )
275 CALL zlaset(
'Full', m, nrhs, czero, czero, b, ldb )
281 IF( scale.NE.1 )
THEN
282 norma = zlange(
'Max', m, n, a, lda, dummy )
283 IF( norma.NE.zero )
THEN
284 IF( scale.EQ.2 )
THEN
288 CALL zlascl(
'General', 0, 0, norma, bignum, m, n, a,
290 CALL dlascl(
'General', 0, 0, norma, bignum, mn, 1, s,
292 CALL zlascl(
'General', 0, 0, norma, bignum, m, nrhs, b,
294 ELSE IF( scale.EQ.3 )
THEN
298 CALL zlascl(
'General', 0, 0, norma, smlnum, m, n, a,
300 CALL dlascl(
'General', 0, 0, norma, smlnum, mn, 1, s,
302 CALL zlascl(
'General', 0, 0, norma, smlnum, m, nrhs, b,
305 CALL xerbla(
'ZQRT15', 1 )
311 norma = dasum( mn, s, 1 )
312 normb = zlange(
'One-norm', m, nrhs, b, ldb, dummy )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
ZQRT15
subroutine zlaror(SIDE, INIT, M, N, A, LDA, ISEED, X, INFO)
ZLAROR
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
ZLARF applies an elementary reflector to a general rectangular matrix.
subroutine dlaord(JOB, N, X, INCX)
DLAORD