95 DOUBLE PRECISION FUNCTION zqrt12( M, N, A, LDA, S, WORK, LWORK,
103 INTEGER lda, lwork, m, n
106 DOUBLE PRECISION rwork( * ), s( * )
107 COMPLEX*16 a( lda, * ), work( lwork )
113 DOUBLE PRECISION zero, one
114 parameter( zero = 0.0d0, one = 1.0d0 )
117 INTEGER i, info, iscl, j, mn
118 DOUBLE PRECISION anrm, bignum, nrmsvl, smlnum
121 DOUBLE PRECISION dummy( 1 )
132 INTRINSIC dble, dcmplx, max, min
140 IF( lwork.LT.m*n+2*min( m, n )+max( m, n ) )
THEN
141 CALL xerbla(
'ZQRT12', 7 )
151 nrmsvl =
dnrm2( mn, s, 1 )
155 CALL zlaset(
'Full', m, n, dcmplx( zero ), dcmplx( zero ), work,
158 DO 10 i = 1, min( j, m )
159 work( ( j-1 )*m+i ) = a( i, j )
166 bignum = one / smlnum
167 CALL dlabad( smlnum, bignum )
171 anrm =
zlange(
'M', m, n, work, m, dummy )
173 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
177 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, work, m, info )
179 ELSE IF( anrm.GT.bignum )
THEN
183 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, work, m, info )
187 IF( anrm.NE.zero )
THEN
191 CALL zgebd2( m, n, work, m, rwork( 1 ), rwork( mn+1 ),
192 $ work( m*n+1 ), work( m*n+mn+1 ),
193 $ work( m*n+2*mn+1 ), info )
194 CALL dbdsqr(
'Upper', mn, 0, 0, 0, rwork( 1 ), rwork( mn+1 ),
195 $ dummy, mn, dummy, 1, dummy, mn, rwork( 2*mn+1 ),
199 IF( anrm.GT.bignum )
THEN
200 CALL dlascl(
'G', 0, 0, bignum, anrm, mn, 1, rwork( 1 ),
203 IF( anrm.LT.smlnum )
THEN
204 CALL dlascl(
'G', 0, 0, smlnum, anrm, mn, 1, rwork( 1 ),
218 CALL daxpy( mn, -one, s, 1, rwork( 1 ), 1 )
220 $ (
dlamch(
'Epsilon' )*dble( max( m, n ) ) )
double precision function dlamch(CMACH)
DLAMCH
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 dbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
DBDSQR
double precision function zqrt12(M, N, A, LDA, S, WORK, LWORK, RWORK)
ZQRT12
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zgebd2(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO)
ZGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm.
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 zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
double precision function dasum(N, DX, INCX)
DASUM
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
real(wp) function dnrm2(n, x, incx)
DNRM2