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 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 dlasrt(id, n, d, info)
DLASRT sorts numbers in increasing or decreasing order.
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 ...