65 SUBROUTINE dsteqr ( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
135 integer,
intent(in) :: ldz, n
136 integer,
intent(out) :: info
138 real (
dp),
intent(inout) :: work(*)
139 real (
dp),
intent(inout) :: d(*), e(*), z(ldz,*)
141 character (len=1),
intent(in) :: compz
145 integer,
parameter :: maxit = 30
147 real (
dp),
parameter :: zero = 0.0_dp
148 real (
dp),
parameter :: one = 1.0_dp
149 real (
dp),
parameter :: two = 2.0_dp
150 real (
dp),
parameter :: three = 3.0_dp
152 integer :: i, icompz, ii, iscale, j, jtot, k, l, l1, lend, lendm1
153 integer :: lendp1, lendsv, lm1, lsv, m, mm, mm1, nm1, nmaxit
155 real (
dp) :: anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2
156 real (
dp) :: s, safmax, safmin, ssfmax, ssfmin, tst
166 IF (
lsame(compz,
'N'))
THEN
168 ELSE IF (
lsame(compz,
'V'))
THEN
170 ELSE IF (
lsame(compz,
'I' ))
THEN
176 IF (icompz.LT.0)
THEN
178 ELSE IF( n.LT.0 )
THEN
180 ELSE IF ((ldz.LT.1).OR.(icompz.GT.0 .AND. ldz.LT.max(1,n)))
THEN
185 CALL xerbla(
'DSTEQR', -info )
194 IF (icompz.EQ.2) z(1,1) = one
203 safmax = one / safmin
204 ssfmax = sqrt(safmax) / three
205 ssfmin = sqrt(safmin) / eps2
210 IF (icompz .EQ. 2)
THEN
211 CALL dlaset (
'Full', n, n, zero, one, z, ldz)
225 IF (l1 .GT. n)
GO TO 160
226 IF (l1 .GT. 1) e(l1-1) = zero
227 IF (l1 .LE. nm1)
THEN
230 IF (tst .EQ. zero)
GO TO 30
231 IF (tst .LE. (sqrt(abs(d(m)))*sqrt(abs(d(m+1))))*eps)
THEN
245 IF (lend .EQ. l)
GO TO 10
249 anorm =
dlanst(
'I', lend-l+1, d(l), e(l))
251 IF (anorm .EQ. zero)
GO TO 10
252 IF (anorm .GT. ssfmax)
THEN
254 CALL dlascl (
'G', 0, 0, anorm, ssfmax, lend-l+1, 1, d(l), n, &
256 CALL dlascl (
'G', 0, 0, anorm, ssfmax, lend-l, 1, e(l), n, &
258 ELSE IF (anorm .LT. ssfmin)
THEN
260 CALL dlascl (
'G', 0, 0, anorm, ssfmin, lend-l+1, 1, d(l), n, &
262 CALL dlascl (
'G', 0, 0, anorm, ssfmin, lend-l, 1, e( l ), n, &
268 IF (abs(d(lend)) .LT. abs(d(l)))
THEN
273 IF (lend .GT. l)
THEN
280 IF (l .NE. lend)
THEN
284 IF (tst .LE. (eps2*abs(d(m)))*abs(d(m+1))+safmin)
GO TO 60
291 IF (m .LT. lend) e(m) = zero
293 IF (m .EQ. l)
GO TO 80
299 IF (icompz .GT. 0)
THEN
300 CALL dlaev2 ( d(l), e(l), d(l+1), rt1, rt2, c, s)
303 CALL dlasr (
'R',
'V',
'B', n, 2, work(l), &
304 & work(n-1+l), z(1, l), ldz)
306 CALL dlae2 (d(l), e(l), d(l+1), rt1, rt2)
312 IF (l .LE. lend)
GO TO 40
316 IF (jtot .EQ. nmaxit)
GO TO 140
321 g = (d(l+1)-p) / (two*e(l))
323 g = d(m) - p + (e(l) / (g + sign(r, g)))
335 CALL dlartg (g, f, c, s, r)
336 IF (i .NE. m-1) e(i+1) = r
338 r = (d(i)-g)*s + two*c*b
345 IF (icompz.GT.0)
THEN
353 IF (icompz.GT.0)
THEN
355 CALL dlasr (
'R',
'V',
'B', n, mm, work(l), work(n-1+l), &
369 IF (l .LE. lend)
GO TO 40
379 IF (l .NE. lend)
THEN
382 tst = abs(e( m-1))**2
383 IF (tst .LE. (eps2*abs(d(m)))*abs(d(m-1))+safmin)
GO TO 110
390 IF (m .GT. lend) e(m-1) = zero
392 IF (m .EQ. l)
GO TO 130
398 IF (icompz .GT. 0)
THEN
399 CALL dlaev2 (d(l-1), e(l-1), d(l), rt1, rt2, c, s)
402 CALL dlasr (
'R',
'V',
'F', n, 2, work(m), &
403 & work(n-1+m), z(1,l-1), ldz)
405 CALL dlae2 (d(l-1), e(l-1), d(l), rt1, rt2)
411 IF (l .GE. lend)
GO TO 90
415 IF (jtot .EQ. nmaxit)
GO TO 140
420 g = (d(l-1)-p) / (two*e(l-1))
422 g = d(m) - p + (e(l-1) / (g+sign(r, g)))
434 CALL dlartg (g, f, c, s, r)
435 IF (i .NE. m) e(i-1) = r
437 r = (d(i+1)-g)*s + two*c*b
444 IF (icompz.GT.0)
THEN
452 IF (icompz.GT.0)
THEN
454 CALL dlasr (
'R',
'V',
'F', n, mm, work(m), work(n-1+m), &
468 IF (l .GE. lend)
GO TO 90
476 IF (iscale .EQ. 1)
THEN
477 CALL dlascl (
'G', 0, 0, ssfmax, anorm, lendsv-lsv+1, 1, &
479 CALL dlascl (
'G', 0, 0, ssfmax, anorm, lendsv-lsv, 1, e(lsv), &
481 ELSE IF (iscale .EQ. 2)
THEN
482 CALL dlascl (
'G', 0, 0, ssfmin, anorm, lendsv-lsv+1, 1, &
484 CALL dlascl (
'G', 0, 0, ssfmin, anorm, lendsv-lsv, 1, e(lsv), &
491 IF (jtot .LT. nmaxit)
GO TO 10
493 IF (e(i) .NE. zero) info = info + 1
500 IF (icompz .EQ. 0)
THEN
504 CALL dlasrt (
'I', n, d, info)
515 IF (d(j) .LT. p)
THEN
523 CALL dswap (n, z(1,i), 1, z(1,k), 1)
975 SUBROUTINE dlamc2 (BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX)
1033 logical,
intent(out) :: rnd
1035 integer,
intent(out) :: beta, emax, emin, t
1037 real (
dp),
intent(out) :: eps, rmax, rmin
1041 logical,
save :: first = .true.
1042 logical,
save :: iwarn = .false.
1043 logical :: ieee, lieee1, lrnd
1045 integer,
save :: lbeta, lemax, lemin, lt
1046 integer :: gnmin, gpmin, i, ngnmin, ngpmin
1048 real (
dp),
save :: leps, lrmax, lrmin
1049 real (
dp) :: a, b, c, half, one, rbase, &
1050 & SIXTH, SMALL, THIRD, TWO, ZERO
1056 first_pass :
IF (first)
THEN
1071 CALL dlamc1 (lbeta, lt, lrnd, lieee1)
1084 third =
dlamc3(sixth, sixth)
1088 IF (b .LT. leps) b = leps
1092 DO WHILE ((leps.GT.b) .AND. (b.GT.zero))
1094 c =
dlamc3(half*leps, (two**5)*(leps**2))
1101 IF (a .LT. leps) leps = a
1112 small =
dlamc3(small*rbase, zero)
1115 CALL dlamc4(ngpmin, one, lbeta)
1116 CALL dlamc4(ngnmin, -one, lbeta)
1117 CALL dlamc4(gpmin, a, lbeta)
1118 CALL dlamc4(gnmin, -a, lbeta)
1121 IF ((ngpmin.EQ.ngnmin) .AND. (gpmin.EQ.gnmin))
THEN
1122 IF (ngpmin .EQ. gpmin)
THEN
1126 ELSE IF ((gpmin-ngpmin) .EQ. 3)
THEN
1127 lemin = ngpmin - 1 + lt
1132 lemin = min(ngpmin, gpmin)
1137 ELSE IF ((ngpmin.EQ.gpmin) .AND. (ngnmin.EQ.gnmin))
THEN
1138 IF (abs(ngpmin-ngnmin) .EQ. 1)
THEN
1139 lemin = max(ngpmin, ngnmin)
1143 lemin = min(ngpmin, ngnmin)
1148 ELSE IF ((abs(ngpmin-ngnmin).EQ.1) .AND. (gpmin.EQ.gnmin))
THEN
1149 IF ((gpmin-min(ngpmin, ngnmin)) .EQ. 3)
THEN
1150 lemin = max(ngpmin, ngnmin ) - 1 + lt
1154 lemin = min(ngpmin, ngnmin)
1160 lemin = min(ngpmin, ngnmin, gpmin, gnmin)
1177 ieee = ieee .OR. lieee1
1185 lrmin =
dlamc3(lrmin*rbase, zero)
1190 CALL dlamc5 (lbeta, lt, lemin, ieee, lemax, lrmax)
1202 10
FORMAT ( / /
' WARNING. The value EMIN may be incorrect:-', &
1203 &
' EMIN = ', i0, /, &
1204 &
' If, after inspection, the value EMIN looks', &
1205 &
' acceptable please comment out ', &
1206 & /,
' the IF block as marked within the code of routine', &
1207 &
' DLAMC2,', /
' otherwise supply EMIN explicitly.', / )
1930 SUBROUTINE dlascl (TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
1999 integer,
intent (in ) :: kl, ku, lda, m, n
2000 integer,
intent (out) :: info
2002 real (
dp),
intent(in ) :: cfrom, cto
2003 real (
dp),
intent(inout) :: a(lda, *)
2005 character (len=1),
intent(in) :: type
2009 real (
r8),
parameter :: zero = 0.0_dp
2010 real (
r8),
parameter :: one = 1.0_dp
2014 integer :: i, itype, j, k1, k2, k3, k4
2016 real (
dp) :: bignum, cfrom1, cfromc, cto1, ctoc, mul, smlnum
2026 IF (
lsame(
TYPE,
'G')) then
2028 ELSE IF (
lsame(
TYPE,
'L')) then
2030 ELSE IF (
lsame(
TYPE,
'U')) then
2032 ELSE IF (
lsame(
TYPE,
'H')) then
2034 ELSE IF (
lsame(
TYPE,
'B')) then
2036 ELSE IF (
lsame(
TYPE,
'Q')) then
2038 ELSE IF (
lsame(
TYPE,
'Z')) then
2044 IF (itype .EQ. -1)
THEN
2046 ELSE IF (cfrom .EQ. zero)
THEN
2048 ELSE IF (m .LT. 0)
THEN
2050 ELSE IF (n.LT.0 .OR. (itype.EQ.4 .AND. n.NE.m) .OR. &
2051 & (itype.EQ.5 .AND. n.NE.m))
THEN
2053 ELSE IF (itype.LE.3 .AND. lda.LT.max(1, m))
THEN
2055 ELSE IF (itype .GE. 4)
THEN
2056 IF (kl.LT.0 .OR. kl.GT.max(m-1, 0))
THEN
2058 ELSE IF (ku.LT.0 .OR. ku.GT.max(n-1, 0) .OR. &
2059 & ((itype.EQ.4 .OR. itype.EQ.5) .AND. kl.NE.ku))
THEN
2061 ELSE IF ((itype.EQ.4 .AND. lda.LT.kl+1) .OR. &
2062 & (itype.EQ.5 .AND. lda.LT.ku+1 ) .OR. &
2063 & (itype.EQ.6 .AND. lda.LT.2*kl+ku+1))
THEN
2068 IF (info .NE. 0)
THEN
2069 CALL xerbla (
'DLASCL', -info)
2075 IF ((n.EQ.0) .OR. (m.EQ.0))
RETURN
2080 bignum = one / smlnum
2087 iterate :
DO WHILE (.NOT. done)
2088 cfrom1 = cfromc*smlnum
2089 cto1 = ctoc / bignum
2090 IF (abs(cfrom1).GT.abs(ctoc) .AND. ctoc.NE.zero)
THEN
2094 ELSE IF (abs(cto1) .GT. abs(cfromc))
THEN
2103 IF (itype .EQ. 0)
THEN
2113 ELSE IF (itype .EQ. 1)
THEN
2123 ELSE IF (itype.EQ.2)
THEN
2133 ELSE IF (itype .EQ. 3)
THEN
2138 DO i = 1, min(j+1, m)
2143 ELSE IF (itype .EQ. 4)
THEN
2150 DO i = 1, min(k3, k4-j)
2155 ELSE IF (itype .EQ. 5)
THEN
2162 DO i = max(k1-j, 1), k3
2167 ELSE IF (itype .EQ. 6)
THEN
2174 k4 = kl + ku + 1 + m
2176 DO i = max(k1-j, k2), min(k3, k4-j)
2297 SUBROUTINE dlasr (SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
2395 integer,
intent(in) :: lda, m, n
2397 real (
dp),
intent(in ) :: c(*), s(*)
2398 real (
dp),
intent(inout) :: a(lda, *)
2400 character (len=1),
intent(in) :: direct, pivot, side
2404 real (
r8),
parameter :: zero = 0.0_dp
2405 real (
r8),
parameter :: one = 1.0_dp
2407 integer :: i, info, j
2409 real (
dp) :: ctemp, stemp, temp
2418 IF (.NOT. (
lsame(side,
'L') .OR.
lsame(side,
'R')))
THEN
2420 ELSE IF (.NOT.(
lsame(pivot,
'V') .OR.
lsame( pivot,
'T') .OR. &
2421 &
lsame(pivot,
'B')))
THEN
2423 ELSE IF (.NOT.(
lsame(direct,
'F') .OR.
lsame(direct,
'B')))
THEN
2425 ELSE IF (m .LT. 0)
THEN
2427 ELSE IF (n .LT. 0)
THEN
2429 ELSE IF (lda .LT. max(1, m))
THEN
2432 IF (info .NE. 0)
THEN
2433 CALL xerbla (
'DLASR ', info)
2439 IF ((m.EQ.0) .OR. (n.EQ.0))
RETURN
2441 IF (
lsame( side,
'L'))
THEN
2445 IF (
lsame(pivot,
'V'))
THEN
2446 IF (
lsame(direct,
'F'))
THEN
2450 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2453 a( j+1,i) = ctemp*temp - stemp*a(j,i)
2454 a( j, i) = stemp*temp + ctemp*a(j,i)
2458 ELSE IF (
lsame(direct,
'B'))
THEN
2462 IF ((ctemp.NE.one) .OR. ( stemp.NE.zero ) )
THEN
2465 a(j+1,i) = ctemp*temp - stemp*a(j,i)
2466 a(j, i) = stemp*temp + ctemp*a(j,i)
2471 ELSE IF (
lsame(pivot,
'T'))
THEN
2472 IF (
lsame(direct,
'F'))
THEN
2476 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2479 a(j,i) = ctemp*temp - stemp*a(1,i)
2480 a(1,i) = stemp*temp + ctemp*a(1,i)
2484 ELSE IF (
lsame( direct,
'B'))
THEN
2488 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2491 a(j,i) = ctemp*temp - stemp*a(1,i)
2492 a(1,i) = stemp*temp + ctemp*a(1,i)
2497 ELSE IF (
lsame(pivot,
'B'))
THEN
2498 IF (
lsame(direct,
'F'))
THEN
2502 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2505 a(j,i) = stemp*a(m,i) + ctemp*temp
2506 a(m,i) = ctemp*a(m,i) - stemp*temp
2510 ELSE IF (
lsame(direct,
'B'))
THEN
2514 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2517 a(j,i) = stemp*a(m,i) + ctemp*temp
2518 a(m,i) = ctemp*a(m,i) - stemp*temp
2524 ELSE IF (
lsame(side,
'R'))
THEN
2528 IF (
lsame(pivot,
'V'))
THEN
2529 IF (
lsame(direct,
'F'))
THEN
2533 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2536 a(i,j+1) = ctemp*temp - stemp*a(i,j)
2537 a(i,j ) = stemp*temp + ctemp*a(i,j)
2541 ELSE IF (
lsame(direct,
'B'))
THEN
2545 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2548 a(i,j+1) = ctemp*temp - stemp*a(i,j)
2549 a(i,j ) = stemp*temp + ctemp*a(i,j)
2554 ELSE IF (
lsame(pivot,
'T'))
THEN
2555 IF (
lsame(direct,
'F'))
THEN
2559 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2562 a(i,j) = ctemp*temp - stemp*a(i,1)
2563 a(i,1) = stemp*temp + ctemp*a(i,1)
2567 ELSE IF (
lsame(direct,
'B'))
THEN
2571 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2574 a(i,j) = ctemp*temp - stemp*a(i,1)
2575 a(i,1) = stemp*temp + ctemp*a(i,1)
2580 ELSE IF (
lsame(pivot,
'B'))
THEN
2581 IF (
lsame(direct,
'F'))
THEN
2585 IF ((ctemp.NE.one ) .OR. (stemp.NE.zero))
THEN
2588 a(i,j) = stemp*a(i,n) + ctemp*temp
2589 a(i,n) = ctemp*a(i,n) - stemp*temp
2593 ELSE IF (
lsame(direct,
'B'))
THEN
2597 IF ((ctemp.NE.one) .OR. (stemp.NE.zero))
THEN
2600 a(i,j) = stemp*a(i,n) + ctemp*temp
2601 a(i,n) = ctemp*a(i,n) - stemp*temp