Annotation of rpl/lapack/lapack/dgehd2.f, revision 1.3
1.1 bertrand 1: SUBROUTINE DGEHD2( N, ILO, IHI, A, LDA, TAU, WORK, INFO )
2: *
3: * -- LAPACK routine (version 3.2) --
4: * -- LAPACK is a software package provided by Univ. of Tennessee, --
5: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6: * November 2006
7: *
8: * .. Scalar Arguments ..
9: INTEGER IHI, ILO, INFO, LDA, N
10: * ..
11: * .. Array Arguments ..
12: DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
13: * ..
14: *
15: * Purpose
16: * =======
17: *
18: * DGEHD2 reduces a real general matrix A to upper Hessenberg form H by
19: * an orthogonal similarity transformation: Q' * A * Q = H .
20: *
21: * Arguments
22: * =========
23: *
24: * N (input) INTEGER
25: * The order of the matrix A. N >= 0.
26: *
27: * ILO (input) INTEGER
28: * IHI (input) INTEGER
29: * It is assumed that A is already upper triangular in rows
30: * and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
31: * set by a previous call to DGEBAL; otherwise they should be
32: * set to 1 and N respectively. See Further Details.
33: * 1 <= ILO <= IHI <= max(1,N).
34: *
35: * A (input/output) DOUBLE PRECISION array, dimension (LDA,N)
36: * On entry, the n by n general matrix to be reduced.
37: * On exit, the upper triangle and the first subdiagonal of A
38: * are overwritten with the upper Hessenberg matrix H, and the
39: * elements below the first subdiagonal, with the array TAU,
40: * represent the orthogonal matrix Q as a product of elementary
41: * reflectors. See Further Details.
42: *
43: * LDA (input) INTEGER
44: * The leading dimension of the array A. LDA >= max(1,N).
45: *
46: * TAU (output) DOUBLE PRECISION array, dimension (N-1)
47: * The scalar factors of the elementary reflectors (see Further
48: * Details).
49: *
50: * WORK (workspace) DOUBLE PRECISION array, dimension (N)
51: *
52: * INFO (output) INTEGER
53: * = 0: successful exit.
54: * < 0: if INFO = -i, the i-th argument had an illegal value.
55: *
56: * Further Details
57: * ===============
58: *
59: * The matrix Q is represented as a product of (ihi-ilo) elementary
60: * reflectors
61: *
62: * Q = H(ilo) H(ilo+1) . . . H(ihi-1).
63: *
64: * Each H(i) has the form
65: *
66: * H(i) = I - tau * v * v'
67: *
68: * where tau is a real scalar, and v is a real vector with
69: * v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
70: * exit in A(i+2:ihi,i), and tau in TAU(i).
71: *
72: * The contents of A are illustrated by the following example, with
73: * n = 7, ilo = 2 and ihi = 6:
74: *
75: * on entry, on exit,
76: *
77: * ( a a a a a a a ) ( a a h h h h a )
78: * ( a a a a a a ) ( a h h h h a )
79: * ( a a a a a a ) ( h h h h h h )
80: * ( a a a a a a ) ( v2 h h h h h )
81: * ( a a a a a a ) ( v2 v3 h h h h )
82: * ( a a a a a a ) ( v2 v3 v4 h h h )
83: * ( a ) ( a )
84: *
85: * where a denotes an element of the original matrix A, h denotes a
86: * modified element of the upper Hessenberg matrix H, and vi denotes an
87: * element of the vector defining H(i).
88: *
89: * =====================================================================
90: *
91: * .. Parameters ..
92: DOUBLE PRECISION ONE
93: PARAMETER ( ONE = 1.0D+0 )
94: * ..
95: * .. Local Scalars ..
96: INTEGER I
97: DOUBLE PRECISION AII
98: * ..
99: * .. External Subroutines ..
100: EXTERNAL DLARF, DLARFG, XERBLA
101: * ..
102: * .. Intrinsic Functions ..
103: INTRINSIC MAX, MIN
104: * ..
105: * .. Executable Statements ..
106: *
107: * Test the input parameters
108: *
109: INFO = 0
110: IF( N.LT.0 ) THEN
111: INFO = -1
112: ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
113: INFO = -2
114: ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
115: INFO = -3
116: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
117: INFO = -5
118: END IF
119: IF( INFO.NE.0 ) THEN
120: CALL XERBLA( 'DGEHD2', -INFO )
121: RETURN
122: END IF
123: *
124: DO 10 I = ILO, IHI - 1
125: *
126: * Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
127: *
128: CALL DLARFG( IHI-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
129: $ TAU( I ) )
130: AII = A( I+1, I )
131: A( I+1, I ) = ONE
132: *
133: * Apply H(i) to A(1:ihi,i+1:ihi) from the right
134: *
135: CALL DLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
136: $ A( 1, I+1 ), LDA, WORK )
137: *
138: * Apply H(i) to A(i+1:ihi,i+1:n) from the left
139: *
140: CALL DLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1, TAU( I ),
141: $ A( I+1, I+1 ), LDA, WORK )
142: *
143: A( I+1, I ) = AII
144: 10 CONTINUE
145: *
146: RETURN
147: *
148: * End of DGEHD2
149: *
150: END
CVSweb interface <joel.bertrand@systella.fr>