annotate libcruft/lapack/dtgevc.f @ 5018:1c65a8e44ef9 ss-2-1-59

[project @ 2004-09-22 03:33:29 by jwe]
author jwe
date Wed, 22 Sep 2004 03:33:29 +0000
parents 15cddaacbc2d
children 68db500cb558
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1 SUBROUTINE DTGEVC( SIDE, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
2 $ LDVL, VR, LDVR, MM, M, WORK, INFO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
3 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
4 * -- LAPACK routine (version 3.0) --
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
5 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
6 * Courant Institute, Argonne National Lab, and Rice University
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
7 * June 30, 1999
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
8 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
9 * .. Scalar Arguments ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
10 CHARACTER HOWMNY, SIDE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
11 INTEGER INFO, LDA, LDB, LDVL, LDVR, M, MM, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
12 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
13 * .. Array Arguments ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
14 LOGICAL SELECT( * )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
15 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), VL( LDVL, * ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
16 $ VR( LDVR, * ), WORK( * )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
17 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
18 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
19 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
20 * Purpose
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
21 * =======
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
22 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
23 * DTGEVC computes some or all of the right and/or left generalized
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
24 * eigenvectors of a pair of real upper triangular matrices (A,B).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
25 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
26 * The right generalized eigenvector x and the left generalized
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
27 * eigenvector y of (A,B) corresponding to a generalized eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
28 * w are defined by:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
29 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
30 * (A - wB) * x = 0 and y**H * (A - wB) = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
31 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
32 * where y**H denotes the conjugate tranpose of y.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
33 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
34 * If an eigenvalue w is determined by zero diagonal elements of both A
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
35 * and B, a unit vector is returned as the corresponding eigenvector.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
36 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
37 * If all eigenvectors are requested, the routine may either return
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
38 * the matrices X and/or Y of right or left eigenvectors of (A,B), or
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
39 * the products Z*X and/or Q*Y, where Z and Q are input orthogonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
40 * matrices. If (A,B) was obtained from the generalized real-Schur
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
41 * factorization of an original pair of matrices
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
42 * (A0,B0) = (Q*A*Z**H,Q*B*Z**H),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
43 * then Z*X and Q*Y are the matrices of right or left eigenvectors of
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
44 * A.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
45 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
46 * A must be block upper triangular, with 1-by-1 and 2-by-2 diagonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
47 * blocks. Corresponding to each 2-by-2 diagonal block is a complex
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
48 * conjugate pair of eigenvalues and eigenvectors; only one
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
49 * eigenvector of the pair is computed, namely the one corresponding
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
50 * to the eigenvalue with positive imaginary part.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
51 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
52 * Arguments
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
53 * =========
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
54 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
55 * SIDE (input) CHARACTER*1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
56 * = 'R': compute right eigenvectors only;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
57 * = 'L': compute left eigenvectors only;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
58 * = 'B': compute both right and left eigenvectors.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
59 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
60 * HOWMNY (input) CHARACTER*1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
61 * = 'A': compute all right and/or left eigenvectors;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
62 * = 'B': compute all right and/or left eigenvectors, and
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
63 * backtransform them using the input matrices supplied
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
64 * in VR and/or VL;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
65 * = 'S': compute selected right and/or left eigenvectors,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
66 * specified by the logical array SELECT.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
67 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
68 * SELECT (input) LOGICAL array, dimension (N)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
69 * If HOWMNY='S', SELECT specifies the eigenvectors to be
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
70 * computed.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
71 * If HOWMNY='A' or 'B', SELECT is not referenced.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
72 * To select the real eigenvector corresponding to the real
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
73 * eigenvalue w(j), SELECT(j) must be set to .TRUE. To select
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
74 * the complex eigenvector corresponding to a complex conjugate
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
75 * pair w(j) and w(j+1), either SELECT(j) or SELECT(j+1) must
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
76 * be set to .TRUE..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
77 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
78 * N (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
79 * The order of the matrices A and B. N >= 0.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
80 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
81 * A (input) DOUBLE PRECISION array, dimension (LDA,N)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
82 * The upper quasi-triangular matrix A.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
83 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
84 * LDA (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
85 * The leading dimension of array A. LDA >= max(1, N).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
86 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
87 * B (input) DOUBLE PRECISION array, dimension (LDB,N)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
88 * The upper triangular matrix B. If A has a 2-by-2 diagonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
89 * block, then the corresponding 2-by-2 block of B must be
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
90 * diagonal with positive elements.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
91 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
92 * LDB (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
93 * The leading dimension of array B. LDB >= max(1,N).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
94 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
95 * VL (input/output) DOUBLE PRECISION array, dimension (LDVL,MM)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
96 * On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
97 * contain an N-by-N matrix Q (usually the orthogonal matrix Q
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
98 * of left Schur vectors returned by DHGEQZ).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
99 * On exit, if SIDE = 'L' or 'B', VL contains:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
100 * if HOWMNY = 'A', the matrix Y of left eigenvectors of (A,B);
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
101 * if HOWMNY = 'B', the matrix Q*Y;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
102 * if HOWMNY = 'S', the left eigenvectors of (A,B) specified by
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
103 * SELECT, stored consecutively in the columns of
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
104 * VL, in the same order as their eigenvalues.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
105 * If SIDE = 'R', VL is not referenced.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
106 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
107 * A complex eigenvector corresponding to a complex eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
108 * is stored in two consecutive columns, the first holding the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
109 * real part, and the second the imaginary part.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
110 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
111 * LDVL (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
112 * The leading dimension of array VL.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
113 * LDVL >= max(1,N) if SIDE = 'L' or 'B'; LDVL >= 1 otherwise.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
114 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
115 * VR (input/output) DOUBLE PRECISION array, dimension (LDVR,MM)
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
116 * On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
117 * contain an N-by-N matrix Q (usually the orthogonal matrix Z
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
118 * of right Schur vectors returned by DHGEQZ).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
119 * On exit, if SIDE = 'R' or 'B', VR contains:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
120 * if HOWMNY = 'A', the matrix X of right eigenvectors of (A,B);
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
121 * if HOWMNY = 'B', the matrix Z*X;
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
122 * if HOWMNY = 'S', the right eigenvectors of (A,B) specified by
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
123 * SELECT, stored consecutively in the columns of
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
124 * VR, in the same order as their eigenvalues.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
125 * If SIDE = 'L', VR is not referenced.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
126 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
127 * A complex eigenvector corresponding to a complex eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
128 * is stored in two consecutive columns, the first holding the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
129 * real part and the second the imaginary part.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
130 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
131 * LDVR (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
132 * The leading dimension of the array VR.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
133 * LDVR >= max(1,N) if SIDE = 'R' or 'B'; LDVR >= 1 otherwise.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
134 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
135 * MM (input) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
136 * The number of columns in the arrays VL and/or VR. MM >= M.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
137 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
138 * M (output) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
139 * The number of columns in the arrays VL and/or VR actually
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
140 * used to store the eigenvectors. If HOWMNY = 'A' or 'B', M
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
141 * is set to N. Each selected real eigenvector occupies one
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
142 * column and each selected complex eigenvector occupies two
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
143 * columns.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
144 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
145 * WORK (workspace) DOUBLE PRECISION array, dimension (6*N)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
146 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
147 * INFO (output) INTEGER
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
148 * = 0: successful exit.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
149 * < 0: if INFO = -i, the i-th argument had an illegal value.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
150 * > 0: the 2-by-2 block (INFO:INFO+1) does not have a complex
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
151 * eigenvalue.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
152 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
153 * Further Details
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
154 * ===============
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
155 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
156 * Allocation of workspace:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
157 * ---------- -- ---------
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
158 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
159 * WORK( j ) = 1-norm of j-th column of A, above the diagonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
160 * WORK( N+j ) = 1-norm of j-th column of B, above the diagonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
161 * WORK( 2*N+1:3*N ) = real part of eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
162 * WORK( 3*N+1:4*N ) = imaginary part of eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
163 * WORK( 4*N+1:5*N ) = real part of back-transformed eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
164 * WORK( 5*N+1:6*N ) = imaginary part of back-transformed eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
165 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
166 * Rowwise vs. columnwise solution methods:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
167 * ------- -- ---------- -------- -------
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
168 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
169 * Finding a generalized eigenvector consists basically of solving the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
170 * singular triangular system
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
171 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
172 * (A - w B) x = 0 (for right) or: (A - w B)**H y = 0 (for left)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
173 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
174 * Consider finding the i-th right eigenvector (assume all eigenvalues
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
175 * are real). The equation to be solved is:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
176 * n i
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
177 * 0 = sum C(j,k) v(k) = sum C(j,k) v(k) for j = i,. . .,1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
178 * k=j k=j
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
179 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
180 * where C = (A - w B) (The components v(i+1:n) are 0.)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
181 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
182 * The "rowwise" method is:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
183 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
184 * (1) v(i) := 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
185 * for j = i-1,. . .,1:
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
186 * i
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
187 * (2) compute s = - sum C(j,k) v(k) and
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
188 * k=j+1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
189 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
190 * (3) v(j) := s / C(j,j)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
191 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
192 * Step 2 is sometimes called the "dot product" step, since it is an
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
193 * inner product between the j-th row and the portion of the eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
194 * that has been computed so far.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
195 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
196 * The "columnwise" method consists basically in doing the sums
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
197 * for all the rows in parallel. As each v(j) is computed, the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
198 * contribution of v(j) times the j-th column of C is added to the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
199 * partial sums. Since FORTRAN arrays are stored columnwise, this has
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
200 * the advantage that at each step, the elements of C that are accessed
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
201 * are adjacent to one another, whereas with the rowwise method, the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
202 * elements accessed at a step are spaced LDA (and LDB) words apart.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
203 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
204 * When finding left eigenvectors, the matrix in question is the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
205 * transpose of the one in storage, so the rowwise method then
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
206 * actually accesses columns of A and B at each step, and so is the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
207 * preferred method.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
208 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
209 * =====================================================================
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
210 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
211 * .. Parameters ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
212 DOUBLE PRECISION ZERO, ONE, SAFETY
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
213 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
214 $ SAFETY = 1.0D+2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
215 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
216 * .. Local Scalars ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
217 LOGICAL COMPL, COMPR, IL2BY2, ILABAD, ILALL, ILBACK,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
218 $ ILBBAD, ILCOMP, ILCPLX, LSA, LSB
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
219 INTEGER I, IBEG, IEIG, IEND, IHWMNY, IINFO, IM, ISIDE,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
220 $ J, JA, JC, JE, JR, JW, NA, NW
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
221 DOUBLE PRECISION ACOEF, ACOEFA, ANORM, ASCALE, BCOEFA, BCOEFI,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
222 $ BCOEFR, BIG, BIGNUM, BNORM, BSCALE, CIM2A,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
223 $ CIM2B, CIMAGA, CIMAGB, CRE2A, CRE2B, CREALA,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
224 $ CREALB, DMIN, SAFMIN, SALFAR, SBETA, SCALE,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
225 $ SMALL, TEMP, TEMP2, TEMP2I, TEMP2R, ULP, XMAX,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
226 $ XSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
227 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
228 * .. Local Arrays ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
229 DOUBLE PRECISION BDIAG( 2 ), SUM( 2, 2 ), SUMA( 2, 2 ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
230 $ SUMB( 2, 2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
231 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
232 * .. External Functions ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
233 LOGICAL LSAME
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
234 DOUBLE PRECISION DLAMCH
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
235 EXTERNAL LSAME, DLAMCH
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
236 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
237 * .. External Subroutines ..
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
238 EXTERNAL DGEMV, DLACPY, DLAG2, DLALN2, XERBLA
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
239 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
240 * .. Intrinsic Functions ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
241 INTRINSIC ABS, MAX, MIN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
242 * ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
243 * .. Executable Statements ..
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
244 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
245 * Decode and Test the input parameters
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
246 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
247 IF( LSAME( HOWMNY, 'A' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
248 IHWMNY = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
249 ILALL = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
250 ILBACK = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
251 ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
252 IHWMNY = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
253 ILALL = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
254 ILBACK = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
255 ELSE IF( LSAME( HOWMNY, 'B' ) .OR. LSAME( HOWMNY, 'T' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
256 IHWMNY = 3
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
257 ILALL = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
258 ILBACK = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
259 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
260 IHWMNY = -1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
261 ILALL = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
262 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
263 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
264 IF( LSAME( SIDE, 'R' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
265 ISIDE = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
266 COMPL = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
267 COMPR = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
268 ELSE IF( LSAME( SIDE, 'L' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
269 ISIDE = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
270 COMPL = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
271 COMPR = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
272 ELSE IF( LSAME( SIDE, 'B' ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
273 ISIDE = 3
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
274 COMPL = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
275 COMPR = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
276 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
277 ISIDE = -1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
278 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
279 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
280 INFO = 0
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
281 IF( ISIDE.LT.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
282 INFO = -1
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
283 ELSE IF( IHWMNY.LT.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
284 INFO = -2
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
285 ELSE IF( N.LT.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
286 INFO = -4
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
287 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
288 INFO = -6
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
289 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
290 INFO = -8
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
291 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
292 IF( INFO.NE.0 ) THEN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
293 CALL XERBLA( 'DTGEVC', -INFO )
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
294 RETURN
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
295 END IF
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
296 *
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
297 * Count the number of eigenvectors to be computed
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
298 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
299 IF( .NOT.ILALL ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
300 IM = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
301 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
302 DO 10 J = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
303 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
304 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
305 GO TO 10
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
306 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
307 IF( J.LT.N ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
308 IF( A( J+1, J ).NE.ZERO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
309 $ ILCPLX = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
310 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
311 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
312 IF( SELECT( J ) .OR. SELECT( J+1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
313 $ IM = IM + 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
314 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
315 IF( SELECT( J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
316 $ IM = IM + 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
317 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
318 10 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
319 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
320 IM = N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
321 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
322 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
323 * Check 2-by-2 diagonal blocks of A, B
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
324 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
325 ILABAD = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
326 ILBBAD = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
327 DO 20 J = 1, N - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
328 IF( A( J+1, J ).NE.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
329 IF( B( J, J ).EQ.ZERO .OR. B( J+1, J+1 ).EQ.ZERO .OR.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
330 $ B( J, J+1 ).NE.ZERO )ILBBAD = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
331 IF( J.LT.N-1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
332 IF( A( J+2, J+1 ).NE.ZERO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
333 $ ILABAD = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
334 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
335 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
336 20 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
337 *
3333
15cddaacbc2d [project @ 1999-11-03 19:53:59 by jwe]
jwe
parents: 3274
diff changeset
338 IF( ILABAD ) THEN
3274
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
339 INFO = -5
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
340 ELSE IF( ILBBAD ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
341 INFO = -7
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
342 ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
343 INFO = -10
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
344 ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
345 INFO = -12
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
346 ELSE IF( MM.LT.IM ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
347 INFO = -13
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
348 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
349 IF( INFO.NE.0 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
350 CALL XERBLA( 'DTGEVC', -INFO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
351 RETURN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
352 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
353 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
354 * Quick return if possible
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
355 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
356 M = IM
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
357 IF( N.EQ.0 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
358 $ RETURN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
359 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
360 * Machine Constants
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
361 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
362 SAFMIN = DLAMCH( 'Safe minimum' )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
363 BIG = ONE / SAFMIN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
364 CALL DLABAD( SAFMIN, BIG )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
365 ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
366 SMALL = SAFMIN*N / ULP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
367 BIG = ONE / SMALL
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
368 BIGNUM = ONE / ( SAFMIN*N )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
369 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
370 * Compute the 1-norm of each column of the strictly upper triangular
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
371 * part (i.e., excluding all elements belonging to the diagonal
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
372 * blocks) of A and B to check for possible overflow in the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
373 * triangular solver.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
374 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
375 ANORM = ABS( A( 1, 1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
376 IF( N.GT.1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
377 $ ANORM = ANORM + ABS( A( 2, 1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
378 BNORM = ABS( B( 1, 1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
379 WORK( 1 ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
380 WORK( N+1 ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
381 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
382 DO 50 J = 2, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
383 TEMP = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
384 TEMP2 = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
385 IF( A( J, J-1 ).EQ.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
386 IEND = J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
387 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
388 IEND = J - 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
389 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
390 DO 30 I = 1, IEND
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
391 TEMP = TEMP + ABS( A( I, J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
392 TEMP2 = TEMP2 + ABS( B( I, J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
393 30 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
394 WORK( J ) = TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
395 WORK( N+J ) = TEMP2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
396 DO 40 I = IEND + 1, MIN( J+1, N )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
397 TEMP = TEMP + ABS( A( I, J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
398 TEMP2 = TEMP2 + ABS( B( I, J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
399 40 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
400 ANORM = MAX( ANORM, TEMP )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
401 BNORM = MAX( BNORM, TEMP2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
402 50 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
403 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
404 ASCALE = ONE / MAX( ANORM, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
405 BSCALE = ONE / MAX( BNORM, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
406 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
407 * Left eigenvectors
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
408 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
409 IF( COMPL ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
410 IEIG = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
411 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
412 * Main loop over eigenvalues
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
413 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
414 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
415 DO 220 JE = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
416 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
417 * Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
418 * (b) this would be the second of a complex pair.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
419 * Check for complex eigenvalue, so as to be sure of which
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
420 * entry(-ies) of SELECT to look at.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
421 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
422 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
423 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
424 GO TO 220
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
425 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
426 NW = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
427 IF( JE.LT.N ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
428 IF( A( JE+1, JE ).NE.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
429 ILCPLX = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
430 NW = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
431 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
432 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
433 IF( ILALL ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
434 ILCOMP = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
435 ELSE IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
436 ILCOMP = SELECT( JE ) .OR. SELECT( JE+1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
437 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
438 ILCOMP = SELECT( JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
439 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
440 IF( .NOT.ILCOMP )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
441 $ GO TO 220
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
442 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
443 * Decide if (a) singular pencil, (b) real eigenvalue, or
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
444 * (c) complex eigenvalue.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
445 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
446 IF( .NOT.ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
447 IF( ABS( A( JE, JE ) ).LE.SAFMIN .AND.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
448 $ ABS( B( JE, JE ) ).LE.SAFMIN ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
449 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
450 * Singular matrix pencil -- return unit eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
451 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
452 IEIG = IEIG + 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
453 DO 60 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
454 VL( JR, IEIG ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
455 60 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
456 VL( IEIG, IEIG ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
457 GO TO 220
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
458 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
459 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
460 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
461 * Clear vector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
462 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
463 DO 70 JR = 1, NW*N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
464 WORK( 2*N+JR ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
465 70 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
466 * T
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
467 * Compute coefficients in ( a A - b B ) y = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
468 * a is ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
469 * b is BCOEFR + i*BCOEFI
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
470 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
471 IF( .NOT.ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
472 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
473 * Real eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
474 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
475 TEMP = ONE / MAX( ABS( A( JE, JE ) )*ASCALE,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
476 $ ABS( B( JE, JE ) )*BSCALE, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
477 SALFAR = ( TEMP*A( JE, JE ) )*ASCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
478 SBETA = ( TEMP*B( JE, JE ) )*BSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
479 ACOEF = SBETA*ASCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
480 BCOEFR = SALFAR*BSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
481 BCOEFI = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
482 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
483 * Scale to avoid underflow
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
484 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
485 SCALE = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
486 LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
487 LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
488 $ SMALL
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
489 IF( LSA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
490 $ SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
491 IF( LSB )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
492 $ SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
493 $ MIN( BNORM, BIG ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
494 IF( LSA .OR. LSB ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
495 SCALE = MIN( SCALE, ONE /
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
496 $ ( SAFMIN*MAX( ONE, ABS( ACOEF ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
497 $ ABS( BCOEFR ) ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
498 IF( LSA ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
499 ACOEF = ASCALE*( SCALE*SBETA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
500 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
501 ACOEF = SCALE*ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
502 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
503 IF( LSB ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
504 BCOEFR = BSCALE*( SCALE*SALFAR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
505 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
506 BCOEFR = SCALE*BCOEFR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
507 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
508 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
509 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
510 BCOEFA = ABS( BCOEFR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
511 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
512 * First component is 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
513 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
514 WORK( 2*N+JE ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
515 XMAX = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
516 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
517 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
518 * Complex eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
519 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
520 CALL DLAG2( A( JE, JE ), LDA, B( JE, JE ), LDB,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
521 $ SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
522 $ BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
523 BCOEFI = -BCOEFI
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
524 IF( BCOEFI.EQ.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
525 INFO = JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
526 RETURN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
527 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
528 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
529 * Scale to avoid over/underflow
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
530 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
531 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
532 BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
533 SCALE = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
534 IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
535 $ SCALE = ( SAFMIN / ULP ) / ACOEFA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
536 IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
537 $ SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
538 IF( SAFMIN*ACOEFA.GT.ASCALE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
539 $ SCALE = ASCALE / ( SAFMIN*ACOEFA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
540 IF( SAFMIN*BCOEFA.GT.BSCALE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
541 $ SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
542 IF( SCALE.NE.ONE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
543 ACOEF = SCALE*ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
544 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
545 BCOEFR = SCALE*BCOEFR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
546 BCOEFI = SCALE*BCOEFI
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
547 BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
548 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
549 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
550 * Compute first two components of eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
551 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
552 TEMP = ACOEF*A( JE+1, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
553 TEMP2R = ACOEF*A( JE, JE ) - BCOEFR*B( JE, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
554 TEMP2I = -BCOEFI*B( JE, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
555 IF( ABS( TEMP ).GT.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
556 WORK( 2*N+JE ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
557 WORK( 3*N+JE ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
558 WORK( 2*N+JE+1 ) = -TEMP2R / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
559 WORK( 3*N+JE+1 ) = -TEMP2I / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
560 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
561 WORK( 2*N+JE+1 ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
562 WORK( 3*N+JE+1 ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
563 TEMP = ACOEF*A( JE, JE+1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
564 WORK( 2*N+JE ) = ( BCOEFR*B( JE+1, JE+1 )-ACOEF*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
565 $ A( JE+1, JE+1 ) ) / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
566 WORK( 3*N+JE ) = BCOEFI*B( JE+1, JE+1 ) / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
567 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
568 XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
569 $ ABS( WORK( 2*N+JE+1 ) )+ABS( WORK( 3*N+JE+1 ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
570 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
571 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
572 DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
573 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
574 * T
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
575 * Triangular solve of (a A - b B) y = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
576 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
577 * T
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
578 * (rowwise in (a A - b B) , or columnwise in (a A - b B) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
579 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
580 IL2BY2 = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
581 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
582 DO 160 J = JE + NW, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
583 IF( IL2BY2 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
584 IL2BY2 = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
585 GO TO 160
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
586 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
587 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
588 NA = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
589 BDIAG( 1 ) = B( J, J )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
590 IF( J.LT.N ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
591 IF( A( J+1, J ).NE.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
592 IL2BY2 = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
593 BDIAG( 2 ) = B( J+1, J+1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
594 NA = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
595 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
596 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
597 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
598 * Check whether scaling is necessary for dot products
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
599 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
600 XSCALE = ONE / MAX( ONE, XMAX )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
601 TEMP = MAX( WORK( J ), WORK( N+J ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
602 $ ACOEFA*WORK( J )+BCOEFA*WORK( N+J ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
603 IF( IL2BY2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
604 $ TEMP = MAX( TEMP, WORK( J+1 ), WORK( N+J+1 ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
605 $ ACOEFA*WORK( J+1 )+BCOEFA*WORK( N+J+1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
606 IF( TEMP.GT.BIGNUM*XSCALE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
607 DO 90 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
608 DO 80 JR = JE, J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
609 WORK( ( JW+2 )*N+JR ) = XSCALE*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
610 $ WORK( ( JW+2 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
611 80 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
612 90 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
613 XMAX = XMAX*XSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
614 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
615 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
616 * Compute dot products
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
617 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
618 * j-1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
619 * SUM = sum conjg( a*A(k,j) - b*B(k,j) )*x(k)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
620 * k=je
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
621 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
622 * To reduce the op count, this is done as
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
623 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
624 * _ j-1 _ j-1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
625 * a*conjg( sum A(k,j)*x(k) ) - b*conjg( sum B(k,j)*x(k) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
626 * k=je k=je
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
627 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
628 * which may cause underflow problems if A or B are close
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
629 * to underflow. (E.g., less than SMALL.)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
630 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
631 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
632 * A series of compiler directives to defeat vectorization
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
633 * for the next loop
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
634 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
635 *$PL$ CMCHAR=' '
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
636 CDIR$ NEXTSCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
637 C$DIR SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
638 CDIR$ NEXT SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
639 CVD$L NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
640 CDEC$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
641 CVD$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
642 *VDIR NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
643 *VOCL LOOP,SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
644 CIBM PREFER SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
645 *$PL$ CMCHAR='*'
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
646 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
647 DO 120 JW = 1, NW
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
648 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
649 *$PL$ CMCHAR=' '
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
650 CDIR$ NEXTSCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
651 C$DIR SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
652 CDIR$ NEXT SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
653 CVD$L NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
654 CDEC$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
655 CVD$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
656 *VDIR NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
657 *VOCL LOOP,SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
658 CIBM PREFER SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
659 *$PL$ CMCHAR='*'
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
660 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
661 DO 110 JA = 1, NA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
662 SUMA( JA, JW ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
663 SUMB( JA, JW ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
664 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
665 DO 100 JR = JE, J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
666 SUMA( JA, JW ) = SUMA( JA, JW ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
667 $ A( JR, J+JA-1 )*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
668 $ WORK( ( JW+1 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
669 SUMB( JA, JW ) = SUMB( JA, JW ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
670 $ B( JR, J+JA-1 )*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
671 $ WORK( ( JW+1 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
672 100 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
673 110 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
674 120 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
675 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
676 *$PL$ CMCHAR=' '
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
677 CDIR$ NEXTSCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
678 C$DIR SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
679 CDIR$ NEXT SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
680 CVD$L NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
681 CDEC$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
682 CVD$ NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
683 *VDIR NOVECTOR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
684 *VOCL LOOP,SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
685 CIBM PREFER SCALAR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
686 *$PL$ CMCHAR='*'
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
687 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
688 DO 130 JA = 1, NA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
689 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
690 SUM( JA, 1 ) = -ACOEF*SUMA( JA, 1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
691 $ BCOEFR*SUMB( JA, 1 ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
692 $ BCOEFI*SUMB( JA, 2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
693 SUM( JA, 2 ) = -ACOEF*SUMA( JA, 2 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
694 $ BCOEFR*SUMB( JA, 2 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
695 $ BCOEFI*SUMB( JA, 1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
696 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
697 SUM( JA, 1 ) = -ACOEF*SUMA( JA, 1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
698 $ BCOEFR*SUMB( JA, 1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
699 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
700 130 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
701 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
702 * T
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
703 * Solve ( a A - b B ) y = SUM(,)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
704 * with scaling and perturbation of the denominator
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
705 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
706 CALL DLALN2( .TRUE., NA, NW, DMIN, ACOEF, A( J, J ), LDA,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
707 $ BDIAG( 1 ), BDIAG( 2 ), SUM, 2, BCOEFR,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
708 $ BCOEFI, WORK( 2*N+J ), N, SCALE, TEMP,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
709 $ IINFO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
710 IF( SCALE.LT.ONE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
711 DO 150 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
712 DO 140 JR = JE, J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
713 WORK( ( JW+2 )*N+JR ) = SCALE*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
714 $ WORK( ( JW+2 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
715 140 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
716 150 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
717 XMAX = SCALE*XMAX
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
718 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
719 XMAX = MAX( XMAX, TEMP )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
720 160 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
721 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
722 * Copy eigenvector to VL, back transforming if
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
723 * HOWMNY='B'.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
724 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
725 IEIG = IEIG + 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
726 IF( ILBACK ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
727 DO 170 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
728 CALL DGEMV( 'N', N, N+1-JE, ONE, VL( 1, JE ), LDVL,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
729 $ WORK( ( JW+2 )*N+JE ), 1, ZERO,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
730 $ WORK( ( JW+4 )*N+1 ), 1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
731 170 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
732 CALL DLACPY( ' ', N, NW, WORK( 4*N+1 ), N, VL( 1, JE ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
733 $ LDVL )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
734 IBEG = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
735 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
736 CALL DLACPY( ' ', N, NW, WORK( 2*N+1 ), N, VL( 1, IEIG ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
737 $ LDVL )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
738 IBEG = JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
739 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
740 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
741 * Scale eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
742 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
743 XMAX = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
744 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
745 DO 180 J = IBEG, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
746 XMAX = MAX( XMAX, ABS( VL( J, IEIG ) )+
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
747 $ ABS( VL( J, IEIG+1 ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
748 180 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
749 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
750 DO 190 J = IBEG, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
751 XMAX = MAX( XMAX, ABS( VL( J, IEIG ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
752 190 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
753 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
754 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
755 IF( XMAX.GT.SAFMIN ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
756 XSCALE = ONE / XMAX
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
757 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
758 DO 210 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
759 DO 200 JR = IBEG, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
760 VL( JR, IEIG+JW ) = XSCALE*VL( JR, IEIG+JW )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
761 200 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
762 210 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
763 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
764 IEIG = IEIG + NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
765 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
766 220 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
767 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
768 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
769 * Right eigenvectors
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
770 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
771 IF( COMPR ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
772 IEIG = IM + 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
773 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
774 * Main loop over eigenvalues
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
775 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
776 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
777 DO 500 JE = N, 1, -1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
778 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
779 * Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
780 * (b) this would be the second of a complex pair.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
781 * Check for complex eigenvalue, so as to be sure of which
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
782 * entry(-ies) of SELECT to look at -- if complex, SELECT(JE)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
783 * or SELECT(JE-1).
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
784 * If this is a complex pair, the 2-by-2 diagonal block
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
785 * corresponding to the eigenvalue is in rows/columns JE-1:JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
786 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
787 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
788 ILCPLX = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
789 GO TO 500
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
790 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
791 NW = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
792 IF( JE.GT.1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
793 IF( A( JE, JE-1 ).NE.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
794 ILCPLX = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
795 NW = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
796 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
797 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
798 IF( ILALL ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
799 ILCOMP = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
800 ELSE IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
801 ILCOMP = SELECT( JE ) .OR. SELECT( JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
802 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
803 ILCOMP = SELECT( JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
804 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
805 IF( .NOT.ILCOMP )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
806 $ GO TO 500
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
807 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
808 * Decide if (a) singular pencil, (b) real eigenvalue, or
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
809 * (c) complex eigenvalue.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
810 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
811 IF( .NOT.ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
812 IF( ABS( A( JE, JE ) ).LE.SAFMIN .AND.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
813 $ ABS( B( JE, JE ) ).LE.SAFMIN ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
814 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
815 * Singular matrix pencil -- unit eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
816 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
817 IEIG = IEIG - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
818 DO 230 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
819 VR( JR, IEIG ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
820 230 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
821 VR( IEIG, IEIG ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
822 GO TO 500
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
823 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
824 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
825 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
826 * Clear vector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
827 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
828 DO 250 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
829 DO 240 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
830 WORK( ( JW+2 )*N+JR ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
831 240 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
832 250 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
833 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
834 * Compute coefficients in ( a A - b B ) x = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
835 * a is ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
836 * b is BCOEFR + i*BCOEFI
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
837 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
838 IF( .NOT.ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
839 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
840 * Real eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
841 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
842 TEMP = ONE / MAX( ABS( A( JE, JE ) )*ASCALE,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
843 $ ABS( B( JE, JE ) )*BSCALE, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
844 SALFAR = ( TEMP*A( JE, JE ) )*ASCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
845 SBETA = ( TEMP*B( JE, JE ) )*BSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
846 ACOEF = SBETA*ASCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
847 BCOEFR = SALFAR*BSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
848 BCOEFI = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
849 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
850 * Scale to avoid underflow
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
851 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
852 SCALE = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
853 LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
854 LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
855 $ SMALL
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
856 IF( LSA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
857 $ SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
858 IF( LSB )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
859 $ SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
860 $ MIN( BNORM, BIG ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
861 IF( LSA .OR. LSB ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
862 SCALE = MIN( SCALE, ONE /
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
863 $ ( SAFMIN*MAX( ONE, ABS( ACOEF ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
864 $ ABS( BCOEFR ) ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
865 IF( LSA ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
866 ACOEF = ASCALE*( SCALE*SBETA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
867 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
868 ACOEF = SCALE*ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
869 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
870 IF( LSB ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
871 BCOEFR = BSCALE*( SCALE*SALFAR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
872 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
873 BCOEFR = SCALE*BCOEFR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
874 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
875 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
876 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
877 BCOEFA = ABS( BCOEFR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
878 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
879 * First component is 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
880 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
881 WORK( 2*N+JE ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
882 XMAX = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
883 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
884 * Compute contribution from column JE of A and B to sum
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
885 * (See "Further Details", above.)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
886 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
887 DO 260 JR = 1, JE - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
888 WORK( 2*N+JR ) = BCOEFR*B( JR, JE ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
889 $ ACOEF*A( JR, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
890 260 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
891 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
892 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
893 * Complex eigenvalue
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
894 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
895 CALL DLAG2( A( JE-1, JE-1 ), LDA, B( JE-1, JE-1 ), LDB,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
896 $ SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
897 $ BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
898 IF( BCOEFI.EQ.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
899 INFO = JE - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
900 RETURN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
901 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
902 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
903 * Scale to avoid over/underflow
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
904 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
905 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
906 BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
907 SCALE = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
908 IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
909 $ SCALE = ( SAFMIN / ULP ) / ACOEFA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
910 IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
911 $ SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
912 IF( SAFMIN*ACOEFA.GT.ASCALE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
913 $ SCALE = ASCALE / ( SAFMIN*ACOEFA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
914 IF( SAFMIN*BCOEFA.GT.BSCALE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
915 $ SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
916 IF( SCALE.NE.ONE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
917 ACOEF = SCALE*ACOEF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
918 ACOEFA = ABS( ACOEF )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
919 BCOEFR = SCALE*BCOEFR
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
920 BCOEFI = SCALE*BCOEFI
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
921 BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
922 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
923 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
924 * Compute first two components of eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
925 * and contribution to sums
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
926 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
927 TEMP = ACOEF*A( JE, JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
928 TEMP2R = ACOEF*A( JE, JE ) - BCOEFR*B( JE, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
929 TEMP2I = -BCOEFI*B( JE, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
930 IF( ABS( TEMP ).GE.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
931 WORK( 2*N+JE ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
932 WORK( 3*N+JE ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
933 WORK( 2*N+JE-1 ) = -TEMP2R / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
934 WORK( 3*N+JE-1 ) = -TEMP2I / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
935 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
936 WORK( 2*N+JE-1 ) = ONE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
937 WORK( 3*N+JE-1 ) = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
938 TEMP = ACOEF*A( JE-1, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
939 WORK( 2*N+JE ) = ( BCOEFR*B( JE-1, JE-1 )-ACOEF*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
940 $ A( JE-1, JE-1 ) ) / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
941 WORK( 3*N+JE ) = BCOEFI*B( JE-1, JE-1 ) / TEMP
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
942 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
943 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
944 XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
945 $ ABS( WORK( 2*N+JE-1 ) )+ABS( WORK( 3*N+JE-1 ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
946 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
947 * Compute contribution from columns JE and JE-1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
948 * of A and B to the sums.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
949 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
950 CREALA = ACOEF*WORK( 2*N+JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
951 CIMAGA = ACOEF*WORK( 3*N+JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
952 CREALB = BCOEFR*WORK( 2*N+JE-1 ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
953 $ BCOEFI*WORK( 3*N+JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
954 CIMAGB = BCOEFI*WORK( 2*N+JE-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
955 $ BCOEFR*WORK( 3*N+JE-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
956 CRE2A = ACOEF*WORK( 2*N+JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
957 CIM2A = ACOEF*WORK( 3*N+JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
958 CRE2B = BCOEFR*WORK( 2*N+JE ) - BCOEFI*WORK( 3*N+JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
959 CIM2B = BCOEFI*WORK( 2*N+JE ) + BCOEFR*WORK( 3*N+JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
960 DO 270 JR = 1, JE - 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
961 WORK( 2*N+JR ) = -CREALA*A( JR, JE-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
962 $ CREALB*B( JR, JE-1 ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
963 $ CRE2A*A( JR, JE ) + CRE2B*B( JR, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
964 WORK( 3*N+JR ) = -CIMAGA*A( JR, JE-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
965 $ CIMAGB*B( JR, JE-1 ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
966 $ CIM2A*A( JR, JE ) + CIM2B*B( JR, JE )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
967 270 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
968 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
969 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
970 DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
971 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
972 * Columnwise triangular solve of (a A - b B) x = 0
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
973 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
974 IL2BY2 = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
975 DO 370 J = JE - NW, 1, -1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
976 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
977 * If a 2-by-2 block, is in position j-1:j, wait until
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
978 * next iteration to process it (when it will be j:j+1)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
979 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
980 IF( .NOT.IL2BY2 .AND. J.GT.1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
981 IF( A( J, J-1 ).NE.ZERO ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
982 IL2BY2 = .TRUE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
983 GO TO 370
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
984 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
985 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
986 BDIAG( 1 ) = B( J, J )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
987 IF( IL2BY2 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
988 NA = 2
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
989 BDIAG( 2 ) = B( J+1, J+1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
990 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
991 NA = 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
992 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
993 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
994 * Compute x(j) (and x(j+1), if 2-by-2 block)
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
995 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
996 CALL DLALN2( .FALSE., NA, NW, DMIN, ACOEF, A( J, J ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
997 $ LDA, BDIAG( 1 ), BDIAG( 2 ), WORK( 2*N+J ),
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
998 $ N, BCOEFR, BCOEFI, SUM, 2, SCALE, TEMP,
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
999 $ IINFO )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1000 IF( SCALE.LT.ONE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1001 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1002 DO 290 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1003 DO 280 JR = 1, JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1004 WORK( ( JW+2 )*N+JR ) = SCALE*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1005 $ WORK( ( JW+2 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1006 280 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1007 290 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1008 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1009 XMAX = MAX( SCALE*XMAX, TEMP )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1010 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1011 DO 310 JW = 1, NW
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1012 DO 300 JA = 1, NA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1013 WORK( ( JW+1 )*N+J+JA-1 ) = SUM( JA, JW )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1014 300 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1015 310 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1016 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1017 * w = w + x(j)*(a A(*,j) - b B(*,j) ) with scaling
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1018 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1019 IF( J.GT.1 ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1020 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1021 * Check whether scaling is necessary for sum.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1022 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1023 XSCALE = ONE / MAX( ONE, XMAX )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1024 TEMP = ACOEFA*WORK( J ) + BCOEFA*WORK( N+J )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1025 IF( IL2BY2 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1026 $ TEMP = MAX( TEMP, ACOEFA*WORK( J+1 )+BCOEFA*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1027 $ WORK( N+J+1 ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1028 TEMP = MAX( TEMP, ACOEFA, BCOEFA )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1029 IF( TEMP.GT.BIGNUM*XSCALE ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1030 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1031 DO 330 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1032 DO 320 JR = 1, JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1033 WORK( ( JW+2 )*N+JR ) = XSCALE*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1034 $ WORK( ( JW+2 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1035 320 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1036 330 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1037 XMAX = XMAX*XSCALE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1038 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1039 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1040 * Compute the contributions of the off-diagonals of
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1041 * column j (and j+1, if 2-by-2 block) of A and B to the
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1042 * sums.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1043 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1044 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1045 DO 360 JA = 1, NA
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1046 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1047 CREALA = ACOEF*WORK( 2*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1048 CIMAGA = ACOEF*WORK( 3*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1049 CREALB = BCOEFR*WORK( 2*N+J+JA-1 ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1050 $ BCOEFI*WORK( 3*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1051 CIMAGB = BCOEFI*WORK( 2*N+J+JA-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1052 $ BCOEFR*WORK( 3*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1053 DO 340 JR = 1, J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1054 WORK( 2*N+JR ) = WORK( 2*N+JR ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1055 $ CREALA*A( JR, J+JA-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1056 $ CREALB*B( JR, J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1057 WORK( 3*N+JR ) = WORK( 3*N+JR ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1058 $ CIMAGA*A( JR, J+JA-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1059 $ CIMAGB*B( JR, J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1060 340 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1061 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1062 CREALA = ACOEF*WORK( 2*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1063 CREALB = BCOEFR*WORK( 2*N+J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1064 DO 350 JR = 1, J - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1065 WORK( 2*N+JR ) = WORK( 2*N+JR ) -
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1066 $ CREALA*A( JR, J+JA-1 ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1067 $ CREALB*B( JR, J+JA-1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1068 350 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1069 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1070 360 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1071 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1072 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1073 IL2BY2 = .FALSE.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1074 370 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1075 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1076 * Copy eigenvector to VR, back transforming if
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1077 * HOWMNY='B'.
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1078 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1079 IEIG = IEIG - NW
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1080 IF( ILBACK ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1081 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1082 DO 410 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1083 DO 380 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1084 WORK( ( JW+4 )*N+JR ) = WORK( ( JW+2 )*N+1 )*
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1085 $ VR( JR, 1 )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1086 380 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1087 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1088 * A series of compiler directives to defeat
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1089 * vectorization for the next loop
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1090 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1091 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1092 DO 400 JC = 2, JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1093 DO 390 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1094 WORK( ( JW+4 )*N+JR ) = WORK( ( JW+4 )*N+JR ) +
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1095 $ WORK( ( JW+2 )*N+JC )*VR( JR, JC )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1096 390 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1097 400 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1098 410 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1099 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1100 DO 430 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1101 DO 420 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1102 VR( JR, IEIG+JW ) = WORK( ( JW+4 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1103 420 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1104 430 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1105 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1106 IEND = N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1107 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1108 DO 450 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1109 DO 440 JR = 1, N
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1110 VR( JR, IEIG+JW ) = WORK( ( JW+2 )*N+JR )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1111 440 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1112 450 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1113 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1114 IEND = JE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1115 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1116 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1117 * Scale eigenvector
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1118 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1119 XMAX = ZERO
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1120 IF( ILCPLX ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1121 DO 460 J = 1, IEND
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1122 XMAX = MAX( XMAX, ABS( VR( J, IEIG ) )+
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1123 $ ABS( VR( J, IEIG+1 ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1124 460 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1125 ELSE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1126 DO 470 J = 1, IEND
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1127 XMAX = MAX( XMAX, ABS( VR( J, IEIG ) ) )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1128 470 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1129 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1130 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1131 IF( XMAX.GT.SAFMIN ) THEN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1132 XSCALE = ONE / XMAX
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1133 DO 490 JW = 0, NW - 1
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1134 DO 480 JR = 1, IEND
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1135 VR( JR, IEIG+JW ) = XSCALE*VR( JR, IEIG+JW )
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1136 480 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1137 490 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1138 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1139 500 CONTINUE
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1140 END IF
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1141 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1142 RETURN
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1143 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1144 * End of DTGEVC
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1145 *
5a691cbef111 [project @ 1999-10-12 05:21:34 by jwe]
jwe
parents:
diff changeset
1146 END