115 DOUBLE PRECISION D( * ), E( * ), WORK( * )
121 DOUBLE PRECISION ZERO
122 parameter( zero = 0.0d0 )
126 DOUBLE PRECISION EPS, SCALE, SAFMIN, SIGMN, SIGMX
133 DOUBLE PRECISION DLAMCH
137 INTRINSIC abs, max, sqrt
144 CALL xerbla(
'DLASQ1', -info )
146 ELSE IF( n.EQ.0 )
THEN
148 ELSE IF( n.EQ.1 )
THEN
149 d( 1 ) = abs( d( 1 ) )
151 ELSE IF( n.EQ.2 )
THEN
152 CALL dlas2( d( 1 ), e( 1 ), d( 2 ), sigmn, sigmx )
162 d( i ) = abs( d( i ) )
163 sigmx = max( sigmx, abs( e( i ) ) )
165 d( n ) = abs( d( n ) )
169 IF( sigmx.EQ.zero )
THEN
170 CALL dlasrt(
'D', n, d, iinfo )
175 sigmx = max( sigmx, d( i ) )
181 eps = dlamch(
'Precision' )
182 safmin = dlamch(
'Safe minimum' )
183 scale = sqrt( eps / safmin )
184 CALL dcopy( n, d, 1, work( 1 ), 2 )
185 CALL dcopy( n-1, e, 1, work( 2 ), 2 )
186 CALL dlascl(
'G', 0, 0, sigmx, scale, 2*n-1, 1, work, 2*n-1,
192 work( i ) = work( i )**2
196 CALL dlasq2( n, work, info )
200 d( i ) = sqrt( work( i ) )
202 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, d, n, iinfo )
203 ELSE IF( info.EQ.2 )
THEN
209 d( i ) = sqrt( work( 2*i-1 ) )
210 e( i ) = sqrt( work( 2*i ) )
212 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, d, n, iinfo )
213 CALL dlascl(
'G', 0, 0, scale, sigmx, n, 1, e, n, iinfo )
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.