114 DOUBLE PRECISION FUNCTION dqrt14( TRANS, M, N, NRHS, A, LDA, X,
123 INTEGER lda, ldx, lwork, m, n, nrhs
126 DOUBLE PRECISION a( lda, * ), work( lwork ), x( ldx, * )
132 DOUBLE PRECISION zero, one
133 parameter( zero = 0.0d0, one = 1.0d0 )
137 INTEGER i, info, j, ldwork
138 DOUBLE PRECISION anrm, err, xnrm
141 DOUBLE PRECISION rwork( 1 )
152 INTRINSIC abs, dble, max, min
157 IF(
lsame( trans,
'N' ) )
THEN
160 IF( lwork.LT.( m+nrhs )*( n+2 ) )
THEN
161 CALL xerbla(
'DQRT14', 10 )
163 ELSE IF( n.LE.0 .OR. nrhs.LE.0 )
THEN
166 ELSE IF(
lsame( trans,
'T' ) )
THEN
169 IF( lwork.LT.( n+nrhs )*( m+2 ) )
THEN
170 CALL xerbla(
'DQRT14', 10 )
172 ELSE IF( m.LE.0 .OR. nrhs.LE.0 )
THEN
176 CALL xerbla(
'DQRT14', 1 )
182 CALL dlacpy(
'All', m, n, a, lda, work, ldwork )
183 anrm =
dlange(
'M', m, n, work, ldwork, rwork )
185 $
CALL dlascl(
'G', 0, 0, anrm, one, m, n, work, ldwork, info )
193 CALL dlacpy(
'All', m, nrhs, x, ldx, work( n*ldwork+1 ),
195 xnrm =
dlange(
'M', m, nrhs, work( n*ldwork+1 ), ldwork,
198 $
CALL dlascl(
'G', 0, 0, xnrm, one, m, nrhs,
199 $ work( n*ldwork+1 ), ldwork, info )
200 anrm =
dlange(
'One-norm', m, n+nrhs, work, ldwork, rwork )
204 CALL dgeqr2( m, n+nrhs, work, ldwork,
205 $ work( ldwork*( n+nrhs )+1 ),
206 $ work( ldwork*( n+nrhs )+min( m, n+nrhs )+1 ),
213 DO 20 j = n + 1, n + nrhs
214 DO 10 i = n + 1, min( m, j )
215 err = max( err, abs( work( i+( j-1 )*m ) ) )
225 work( m+j+( i-1 )*ldwork ) = x( i, j )
229 xnrm =
dlange(
'M', nrhs, n, work( m+1 ), ldwork, rwork )
231 $
CALL dlascl(
'G', 0, 0, xnrm, one, nrhs, n, work( m+1 ),
236 CALL dgelq2( ldwork, n, work, ldwork, work( ldwork*n+1 ),
237 $ work( ldwork*( n+1 )+1 ), info )
245 err = max( err, abs( work( i+( j-1 )*ldwork ) ) )
251 dqrt14 = err / ( dble( max( m, n, nrhs ) )*
dlamch(
'Epsilon' ) )
double precision function dlamch(CMACH)
DLAMCH
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 dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
double precision function dqrt14(TRANS, M, N, NRHS, A, LDA, X, LDX, WORK, LWORK)
DQRT14
double precision function dlange(NORM, M, N, A, LDA, WORK)
DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine dgelq2(M, N, A, LDA, TAU, WORK, INFO)
DGELQ2 computes the LQ factorization of a general rectangular matrix using an unblocked algorithm.
subroutine dgeqr2(M, N, A, LDA, TAU, WORK, INFO)
DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm.