annotate libcruft/lapack/dlasq2.f @ 5103:e2ed74b9bfa0 after-gnuplot-split

[project @ 2004-12-28 02:43:01 by jwe]
author jwe
date Tue, 28 Dec 2004 02:43:01 +0000
parents edcaebe1b81b
children 68db500cb558
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
1 SUBROUTINE DLASQ2( N, Z, INFO )
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
2 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
3 * -- LAPACK routine (version 3.0) --
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
4 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
5 * Courant Institute, Argonne National Lab, and Rice University
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
6 * October 31, 1999
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
7 *
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
8 * .. Scalar Arguments ..
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
9 INTEGER INFO, N
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
10 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
11 * .. Array Arguments ..
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
12 DOUBLE PRECISION Z( * )
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
13 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
14 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
15 * Purpose
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
16 * =======
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
17 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
18 * DLASQ2 computes all the eigenvalues of the symmetric positive
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
19 * definite tridiagonal matrix associated with the qd array Z to high
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
20 * relative accuracy are computed to high relative accuracy, in the
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
21 * absence of denormalization, underflow and overflow.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
22 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
23 * To see the relation of Z to the tridiagonal matrix, let L be a
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
24 * unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
25 * let U be an upper bidiagonal matrix with 1's above and diagonal
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
26 * Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
27 * symmetric tridiagonal to which it is similar.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
28 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
29 * Note : DLASQ2 defines a logical variable, IEEE, which is true
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
30 * on machines which follow ieee-754 floating-point standard in their
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
31 * handling of infinities and NaNs, and false otherwise. This variable
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
32 * is passed to DLASQ3.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
33 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
34 * Arguments
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
35 * =========
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
36 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
37 * N (input) INTEGER
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
38 * The number of rows and columns in the matrix. N >= 0.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
39 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
40 * Z (workspace) DOUBLE PRECISION array, dimension ( 4*N )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
41 * On entry Z holds the qd array. On exit, entries 1 to N hold
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
42 * the eigenvalues in decreasing order, Z( 2*N+1 ) holds the
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
43 * trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
44 * N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
45 * holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
46 * shifts that failed.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
47 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
48 * INFO (output) INTEGER
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
49 * = 0: successful exit
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
50 * < 0: if the i-th argument is a scalar and had an illegal
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
51 * value, then INFO = -i, if the i-th argument is an
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
52 * array and the j-entry had an illegal value, then
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
53 * INFO = -(i*100+j)
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
54 * > 0: the algorithm failed
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
55 * = 1, a split was marked by a positive value in E
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
56 * = 2, current block of Z not diagonalized after 30*N
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
57 * iterations (in inner while loop)
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
58 * = 3, termination criterion of outer while loop not met
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
59 * (program created more than N unreduced blocks)
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
60 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
61 * Further Details
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
62 * ===============
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
63 * Local Variables: I0:N0 defines a current unreduced segment of Z.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
64 * The shifts are accumulated in SIGMA. Iteration count is in ITER.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
65 * Ping-pong is controlled by PP (alternates between 0 and 1).
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
66 *
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
67 * =====================================================================
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
68 *
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
69 * .. Parameters ..
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
70 DOUBLE PRECISION CBIAS
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
71 PARAMETER ( CBIAS = 1.50D0 )
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
72 DOUBLE PRECISION ZERO, HALF, ONE, TWO, FOUR, HUNDRD
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
73 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0,
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
74 $ TWO = 2.0D0, FOUR = 4.0D0, HUNDRD = 100.0D0 )
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
75 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
76 * .. Local Scalars ..
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
77 LOGICAL IEEE
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
78 INTEGER I0, I4, IINFO, IPN4, ITER, IWHILA, IWHILB, K,
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
79 $ N0, NBIG, NDIV, NFAIL, PP, SPLT
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
80 DOUBLE PRECISION D, DESIG, DMIN, E, EMAX, EMIN, EPS, OLDEMN,
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
81 $ QMAX, QMIN, S, SAFMIN, SIGMA, T, TEMP, TOL,
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
82 $ TOL2, TRACE, ZMAX
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
83 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
84 * .. External Subroutines ..
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
85 EXTERNAL DLASQ3, DLASRT, XERBLA
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
86 * ..
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
87 * .. External Functions ..
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
88 INTEGER ILAENV
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
89 DOUBLE PRECISION DLAMCH
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
90 EXTERNAL DLAMCH, ILAENV
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
91 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
92 * .. Intrinsic Functions ..
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
93 INTRINSIC DBLE, MAX, MIN, SQRT
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
94 * ..
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
95 * .. Executable Statements ..
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
96 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
97 * Test the input arguments.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
98 * (in case DLASQ2 is not called by DLASQ1)
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
99 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
100 INFO = 0
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
101 EPS = DLAMCH( 'Precision' )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
102 SAFMIN = DLAMCH( 'Safe minimum' )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
103 TOL = EPS*HUNDRD
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
104 TOL2 = TOL**2
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
105 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
106 IF( N.LT.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
107 INFO = -1
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
108 CALL XERBLA( 'DLASQ2', 1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
109 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
110 ELSE IF( N.EQ.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
111 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
112 ELSE IF( N.EQ.1 ) THEN
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
113 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
114 * 1-by-1 case.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
115 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
116 IF( Z( 1 ).LT.ZERO ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
117 INFO = -201
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
118 CALL XERBLA( 'DLASQ2', 2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
119 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
120 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
121 ELSE IF( N.EQ.2 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
122 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
123 * 2-by-2 case.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
124 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
125 IF( Z( 2 ).LT.ZERO .OR. Z( 3 ).LT.ZERO ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
126 INFO = -2
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
127 CALL XERBLA( 'DLASQ2', 2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
128 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
129 ELSE IF( Z( 3 ).GT.Z( 1 ) ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
130 D = Z( 3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
131 Z( 3 ) = Z( 1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
132 Z( 1 ) = D
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
133 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
134 Z( 5 ) = Z( 1 ) + Z( 2 ) + Z( 3 )
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
135 IF( Z( 2 ).GT.Z( 3 )*TOL2 ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
136 T = HALF*( ( Z( 1 )-Z( 3 ) )+Z( 2 ) )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
137 S = Z( 3 )*( Z( 2 ) / T )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
138 IF( S.LE.T ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
139 S = Z( 3 )*( Z( 2 ) / ( T*( ONE+SQRT( ONE+S / T ) ) ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
140 ELSE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
141 S = Z( 3 )*( Z( 2 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
142 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
143 T = Z( 1 ) + ( S+Z( 2 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
144 Z( 3 ) = Z( 3 )*( Z( 1 ) / T )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
145 Z( 1 ) = T
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
146 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
147 Z( 2 ) = Z( 3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
148 Z( 6 ) = Z( 2 ) + Z( 1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
149 RETURN
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
150 END IF
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
151 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
152 * Check for negative data and compute sums of q's and e's.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
153 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
154 Z( 2*N ) = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
155 EMIN = Z( 2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
156 QMAX = ZERO
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
157 ZMAX = ZERO
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
158 D = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
159 E = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
160 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
161 DO 10 K = 1, 2*( N-1 ), 2
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
162 IF( Z( K ).LT.ZERO ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
163 INFO = -( 200+K )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
164 CALL XERBLA( 'DLASQ2', 2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
165 RETURN
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
166 ELSE IF( Z( K+1 ).LT.ZERO ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
167 INFO = -( 200+K+1 )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
168 CALL XERBLA( 'DLASQ2', 2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
169 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
170 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
171 D = D + Z( K )
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
172 E = E + Z( K+1 )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
173 QMAX = MAX( QMAX, Z( K ) )
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
174 EMIN = MIN( EMIN, Z( K+1 ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
175 ZMAX = MAX( QMAX, ZMAX, Z( K+1 ) )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
176 10 CONTINUE
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
177 IF( Z( 2*N-1 ).LT.ZERO ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
178 INFO = -( 200+2*N-1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
179 CALL XERBLA( 'DLASQ2', 2 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
180 RETURN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
181 END IF
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
182 D = D + Z( 2*N-1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
183 QMAX = MAX( QMAX, Z( 2*N-1 ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
184 ZMAX = MAX( QMAX, ZMAX )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
185 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
186 * Check for diagonality.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
187 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
188 IF( E.EQ.ZERO ) THEN
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
189 DO 20 K = 2, N
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
190 Z( K ) = Z( 2*K-1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
191 20 CONTINUE
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
192 CALL DLASRT( 'D', N, Z, IINFO )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
193 Z( 2*N-1 ) = D
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
194 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
195 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
196 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
197 TRACE = D + E
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
198 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
199 * Check for zero data.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
200 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
201 IF( TRACE.EQ.ZERO ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
202 Z( 2*N-1 ) = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
203 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
204 END IF
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
205 *
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
206 * Check whether the machine is IEEE conformable.
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
207 *
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
208 IEEE = ILAENV( 10, 'DLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 .AND.
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
209 $ ILAENV( 11, 'DLASQ2', 'N', 1, 2, 3, 4 ).EQ.1
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
210 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
211 * Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...).
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
212 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
213 DO 30 K = 2*N, 2, -2
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
214 Z( 2*K ) = ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
215 Z( 2*K-1 ) = Z( K )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
216 Z( 2*K-2 ) = ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
217 Z( 2*K-3 ) = Z( K-1 )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
218 30 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
219 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
220 I0 = 1
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
221 N0 = N
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
222 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
223 * Reverse the qd-array, if warranted.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
224 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
225 IF( CBIAS*Z( 4*I0-3 ).LT.Z( 4*N0-3 ) ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
226 IPN4 = 4*( I0+N0 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
227 DO 40 I4 = 4*I0, 2*( I0+N0-1 ), 4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
228 TEMP = Z( I4-3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
229 Z( I4-3 ) = Z( IPN4-I4-3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
230 Z( IPN4-I4-3 ) = TEMP
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
231 TEMP = Z( I4-1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
232 Z( I4-1 ) = Z( IPN4-I4-5 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
233 Z( IPN4-I4-5 ) = TEMP
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
234 40 CONTINUE
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
235 END IF
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
236 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
237 * Initial split checking via dqd and Li's test.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
238 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
239 PP = 0
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
240 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
241 DO 80 K = 1, 2
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
242 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
243 D = Z( 4*N0+PP-3 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
244 DO 50 I4 = 4*( N0-1 ) + PP, 4*I0 + PP, -4
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
245 IF( Z( I4-1 ).LE.TOL2*D ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
246 Z( I4-1 ) = -ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
247 D = Z( I4-3 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
248 ELSE
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
249 D = Z( I4-3 )*( D / ( D+Z( I4-1 ) ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
250 END IF
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
251 50 CONTINUE
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
252 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
253 * dqd maps Z to ZZ plus Li's test.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
254 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
255 EMIN = Z( 4*I0+PP+1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
256 D = Z( 4*I0+PP-3 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
257 DO 60 I4 = 4*I0 + PP, 4*( N0-1 ) + PP, 4
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
258 Z( I4-2*PP-2 ) = D + Z( I4-1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
259 IF( Z( I4-1 ).LE.TOL2*D ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
260 Z( I4-1 ) = -ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
261 Z( I4-2*PP-2 ) = D
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
262 Z( I4-2*PP ) = ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
263 D = Z( I4+1 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
264 ELSE IF( SAFMIN*Z( I4+1 ).LT.Z( I4-2*PP-2 ) .AND.
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
265 $ SAFMIN*Z( I4-2*PP-2 ).LT.Z( I4+1 ) ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
266 TEMP = Z( I4+1 ) / Z( I4-2*PP-2 )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
267 Z( I4-2*PP ) = Z( I4-1 )*TEMP
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
268 D = D*TEMP
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
269 ELSE
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
270 Z( I4-2*PP ) = Z( I4+1 )*( Z( I4-1 ) / Z( I4-2*PP-2 ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
271 D = Z( I4+1 )*( D / Z( I4-2*PP-2 ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
272 END IF
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
273 EMIN = MIN( EMIN, Z( I4-2*PP ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
274 60 CONTINUE
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
275 Z( 4*N0-PP-2 ) = D
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
276 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
277 * Now find qmax.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
278 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
279 QMAX = Z( 4*I0-PP-2 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
280 DO 70 I4 = 4*I0 - PP + 2, 4*N0 - PP - 2, 4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
281 QMAX = MAX( QMAX, Z( I4 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
282 70 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
283 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
284 * Prepare for the next iteration on K.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
285 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
286 PP = 1 - PP
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
287 80 CONTINUE
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
288 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
289 ITER = 2
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
290 NFAIL = 0
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
291 NDIV = 2*( N0-I0 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
292 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
293 DO 140 IWHILA = 1, N + 1
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
294 IF( N0.LT.1 )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
295 $ GO TO 150
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
296 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
297 * While array unfinished do
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
298 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
299 * E(N0) holds the value of SIGMA when submatrix in I0:N0
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
300 * splits from the rest of the array, but is negated.
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
301 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
302 DESIG = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
303 IF( N0.EQ.N ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
304 SIGMA = ZERO
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
305 ELSE
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
306 SIGMA = -Z( 4*N0-1 )
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
307 END IF
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
308 IF( SIGMA.LT.ZERO ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
309 INFO = 1
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
310 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
311 END IF
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
312 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
313 * Find last unreduced submatrix's top index I0, find QMAX and
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
314 * EMIN. Find Gershgorin-type bound if Q's much greater than E's.
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
315 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
316 EMAX = ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
317 IF( N0.GT.I0 ) THEN
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
318 EMIN = ABS( Z( 4*N0-5 ) )
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
319 ELSE
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
320 EMIN = ZERO
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
321 END IF
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
322 QMIN = Z( 4*N0-3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
323 QMAX = QMIN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
324 DO 90 I4 = 4*N0, 8, -4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
325 IF( Z( I4-5 ).LE.ZERO )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
326 $ GO TO 100
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
327 IF( QMIN.GE.FOUR*EMAX ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
328 QMIN = MIN( QMIN, Z( I4-3 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
329 EMAX = MAX( EMAX, Z( I4-5 ) )
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
330 END IF
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
331 QMAX = MAX( QMAX, Z( I4-7 )+Z( I4-5 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
332 EMIN = MIN( EMIN, Z( I4-5 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
333 90 CONTINUE
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
334 I4 = 4
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
335 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
336 100 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
337 I0 = I4 / 4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
338 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
339 * Store EMIN for passing to DLASQ3.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
340 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
341 Z( 4*N0-1 ) = EMIN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
342 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
343 * Put -(initial shift) into DMIN.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
344 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
345 DMIN = -MAX( ZERO, QMIN-TWO*SQRT( QMIN )*SQRT( EMAX ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
346 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
347 * Now I0:N0 is unreduced. PP = 0 for ping, PP = 1 for pong.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
348 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
349 PP = 0
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
350 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
351 NBIG = 30*( N0-I0+1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
352 DO 120 IWHILB = 1, NBIG
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
353 IF( I0.GT.N0 )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
354 $ GO TO 130
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
355 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
356 * While submatrix unfinished take a good dqds step.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
357 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
358 CALL DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
359 $ ITER, NDIV, IEEE )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
360 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
361 PP = 1 - PP
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
362 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
363 * When EMIN is very small check for splits.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
364 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
365 IF( PP.EQ.0 .AND. N0-I0.GE.3 ) THEN
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
366 IF( Z( 4*N0 ).LE.TOL2*QMAX .OR.
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
367 $ Z( 4*N0-1 ).LE.TOL2*SIGMA ) THEN
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
368 SPLT = I0 - 1
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
369 QMAX = Z( 4*I0-3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
370 EMIN = Z( 4*I0-1 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
371 OLDEMN = Z( 4*I0 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
372 DO 110 I4 = 4*I0, 4*( N0-3 ), 4
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
373 IF( Z( I4 ).LE.TOL2*Z( I4-3 ) .OR.
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
374 $ Z( I4-1 ).LE.TOL2*SIGMA ) THEN
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
375 Z( I4-1 ) = -SIGMA
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
376 SPLT = I4 / 4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
377 QMAX = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
378 EMIN = Z( I4+3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
379 OLDEMN = Z( I4+4 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
380 ELSE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
381 QMAX = MAX( QMAX, Z( I4+1 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
382 EMIN = MIN( EMIN, Z( I4-1 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
383 OLDEMN = MIN( OLDEMN, Z( I4 ) )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
384 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
385 110 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
386 Z( 4*N0-1 ) = EMIN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
387 Z( 4*N0 ) = OLDEMN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
388 I0 = SPLT + 1
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
389 END IF
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
390 END IF
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
391 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
392 120 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
393 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
394 INFO = 2
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
395 RETURN
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
396 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
397 * end IWHILB
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
398 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
399 130 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
400 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
401 140 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
402 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
403 INFO = 3
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
404 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
405 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
406 * end IWHILA
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
407 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
408 150 CONTINUE
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
409 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
410 * Move q's to the front.
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
411 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
412 DO 160 K = 2, N
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
413 Z( K ) = Z( 4*K-3 )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
414 160 CONTINUE
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
415 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
416 * Sort and compute sum of eigenvalues.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
417 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
418 CALL DLASRT( 'D', N, Z, IINFO )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
419 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
420 E = ZERO
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
421 DO 170 K = N, 1, -1
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
422 E = E + Z( K )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
423 170 CONTINUE
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
424 *
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
425 * Store trace, sum(eigenvalues) and information on performance.
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
426 *
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
427 Z( 2*N+1 ) = TRACE
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
428 Z( 2*N+2 ) = E
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
429 Z( 2*N+3 ) = DBLE( ITER )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
430 Z( 2*N+4 ) = DBLE( NDIV ) / DBLE( N**2 )
3596
edcaebe1b81b [project @ 2000-02-10 09:26:48 by jwe]
jwe
parents: 3333
diff changeset
431 Z( 2*N+5 ) = HUNDRD*NFAIL / DBLE( ITER )
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 2329
diff changeset
432 RETURN
2329
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
433 *
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
434 * End of DLASQ2
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
435 *
30c606bec7a8 [project @ 1996-07-19 01:29:05 by jwe]
jwe
parents:
diff changeset
436 END