117 DOUBLE PRECISION D( * ), E( * ), WORK( * )
123 DOUBLE PRECISION ZERO
124 parameter( zero = 0.0d0 )
128 DOUBLE PRECISION EPS, SCALE, SAFMIN, SIGMN, SIGMX
134 DOUBLE PRECISION DLAMCH
138 INTRINSIC abs, max, sqrt
145 CALL xerbla(
'DLASQ1', -info )
147 ELSE IF( n.EQ.0 )
THEN
149 ELSE IF( n.EQ.1 )
THEN
150 d( 1 ) = abs( d( 1 ) )
152 ELSE IF( n.EQ.2 )
THEN
153 CALL dlas2( d( 1 ), e( 1 ), d( 2 ), sigmn, sigmx )
163 d( i ) = abs( d( i ) )
164 sigmx = max( sigmx, abs( e( i ) ) )
166 d( n ) = abs( d( n ) )
170 IF( sigmx.EQ.zero )
THEN
171 CALL dlasrt(
'D', n, d, iinfo )
176 sigmx = max( sigmx, d( i ) )
182 eps = dlamch(
'Precision' )
183 safmin = dlamch(
'Safe minimum' )
184 scale = sqrt( eps / safmin )
185 CALL dcopy( n, d, 1, work( 1 ), 2 )
186 CALL dcopy( n-1, e, 1, work( 2 ), 2 )
187 CALL dlascl(
'G', 0, 0, sigmx, scale, 2*n-1, 1, work, 2*n-1,
193 work( i ) = work( i )**2
197 CALL dlasq2( n, work, info )
201 d( i ) = sqrt( work( i ) )
203 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, d, n, iinfo )
204 ELSE IF( info.EQ.2 )
THEN
210 d( i ) = sqrt( work( 2*i-1 ) )
211 e( i ) = sqrt( work( 2*i ) )
213 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, d, n, iinfo )
214 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, e, n, iinfo )
subroutine xerbla(srname, info)
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dlas2(f, g, h, ssmin, ssmax)
DLAS2 computes singular values of a 2-by-2 triangular matrix.
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 dlasq1(n, d, e, work, info)
DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine dlasq2(n, z, info)
DLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix associated ...
subroutine dlasrt(id, n, d, info)
DLASRT sorts numbers in increasing or decreasing order.