root / src / lapack / double / dlarz.f @ 1
Historique | Voir | Annoter | Télécharger (4,14 ko)
1 | 1 | equemene | SUBROUTINE DLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK ) |
---|---|---|---|
2 | 1 | equemene | * |
3 | 1 | equemene | * -- LAPACK routine (version 3.2) -- |
4 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
5 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
6 | 1 | equemene | * November 2006 |
7 | 1 | equemene | * |
8 | 1 | equemene | * .. Scalar Arguments .. |
9 | 1 | equemene | CHARACTER SIDE |
10 | 1 | equemene | INTEGER INCV, L, LDC, M, N |
11 | 1 | equemene | DOUBLE PRECISION TAU |
12 | 1 | equemene | * .. |
13 | 1 | equemene | * .. Array Arguments .. |
14 | 1 | equemene | DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) |
15 | 1 | equemene | * .. |
16 | 1 | equemene | * |
17 | 1 | equemene | * Purpose |
18 | 1 | equemene | * ======= |
19 | 1 | equemene | * |
20 | 1 | equemene | * DLARZ applies a real elementary reflector H to a real M-by-N |
21 | 1 | equemene | * matrix C, from either the left or the right. H is represented in the |
22 | 1 | equemene | * form |
23 | 1 | equemene | * |
24 | 1 | equemene | * H = I - tau * v * v' |
25 | 1 | equemene | * |
26 | 1 | equemene | * where tau is a real scalar and v is a real vector. |
27 | 1 | equemene | * |
28 | 1 | equemene | * If tau = 0, then H is taken to be the unit matrix. |
29 | 1 | equemene | * |
30 | 1 | equemene | * |
31 | 1 | equemene | * H is a product of k elementary reflectors as returned by DTZRZF. |
32 | 1 | equemene | * |
33 | 1 | equemene | * Arguments |
34 | 1 | equemene | * ========= |
35 | 1 | equemene | * |
36 | 1 | equemene | * SIDE (input) CHARACTER*1 |
37 | 1 | equemene | * = 'L': form H * C |
38 | 1 | equemene | * = 'R': form C * H |
39 | 1 | equemene | * |
40 | 1 | equemene | * M (input) INTEGER |
41 | 1 | equemene | * The number of rows of the matrix C. |
42 | 1 | equemene | * |
43 | 1 | equemene | * N (input) INTEGER |
44 | 1 | equemene | * The number of columns of the matrix C. |
45 | 1 | equemene | * |
46 | 1 | equemene | * L (input) INTEGER |
47 | 1 | equemene | * The number of entries of the vector V containing |
48 | 1 | equemene | * the meaningful part of the Householder vectors. |
49 | 1 | equemene | * If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. |
50 | 1 | equemene | * |
51 | 1 | equemene | * V (input) DOUBLE PRECISION array, dimension (1+(L-1)*abs(INCV)) |
52 | 1 | equemene | * The vector v in the representation of H as returned by |
53 | 1 | equemene | * DTZRZF. V is not used if TAU = 0. |
54 | 1 | equemene | * |
55 | 1 | equemene | * INCV (input) INTEGER |
56 | 1 | equemene | * The increment between elements of v. INCV <> 0. |
57 | 1 | equemene | * |
58 | 1 | equemene | * TAU (input) DOUBLE PRECISION |
59 | 1 | equemene | * The value tau in the representation of H. |
60 | 1 | equemene | * |
61 | 1 | equemene | * C (input/output) DOUBLE PRECISION array, dimension (LDC,N) |
62 | 1 | equemene | * On entry, the M-by-N matrix C. |
63 | 1 | equemene | * On exit, C is overwritten by the matrix H * C if SIDE = 'L', |
64 | 1 | equemene | * or C * H if SIDE = 'R'. |
65 | 1 | equemene | * |
66 | 1 | equemene | * LDC (input) INTEGER |
67 | 1 | equemene | * The leading dimension of the array C. LDC >= max(1,M). |
68 | 1 | equemene | * |
69 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension |
70 | 1 | equemene | * (N) if SIDE = 'L' |
71 | 1 | equemene | * or (M) if SIDE = 'R' |
72 | 1 | equemene | * |
73 | 1 | equemene | * Further Details |
74 | 1 | equemene | * =============== |
75 | 1 | equemene | * |
76 | 1 | equemene | * Based on contributions by |
77 | 1 | equemene | * A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA |
78 | 1 | equemene | * |
79 | 1 | equemene | * ===================================================================== |
80 | 1 | equemene | * |
81 | 1 | equemene | * .. Parameters .. |
82 | 1 | equemene | DOUBLE PRECISION ONE, ZERO |
83 | 1 | equemene | PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) |
84 | 1 | equemene | * .. |
85 | 1 | equemene | * .. External Subroutines .. |
86 | 1 | equemene | EXTERNAL DAXPY, DCOPY, DGEMV, DGER |
87 | 1 | equemene | * .. |
88 | 1 | equemene | * .. External Functions .. |
89 | 1 | equemene | LOGICAL LSAME |
90 | 1 | equemene | EXTERNAL LSAME |
91 | 1 | equemene | * .. |
92 | 1 | equemene | * .. Executable Statements .. |
93 | 1 | equemene | * |
94 | 1 | equemene | IF( LSAME( SIDE, 'L' ) ) THEN |
95 | 1 | equemene | * |
96 | 1 | equemene | * Form H * C |
97 | 1 | equemene | * |
98 | 1 | equemene | IF( TAU.NE.ZERO ) THEN |
99 | 1 | equemene | * |
100 | 1 | equemene | * w( 1:n ) = C( 1, 1:n ) |
101 | 1 | equemene | * |
102 | 1 | equemene | CALL DCOPY( N, C, LDC, WORK, 1 ) |
103 | 1 | equemene | * |
104 | 1 | equemene | * w( 1:n ) = w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l ) |
105 | 1 | equemene | * |
106 | 1 | equemene | CALL DGEMV( 'Transpose', L, N, ONE, C( M-L+1, 1 ), LDC, V, |
107 | 1 | equemene | $ INCV, ONE, WORK, 1 ) |
108 | 1 | equemene | * |
109 | 1 | equemene | * C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n ) |
110 | 1 | equemene | * |
111 | 1 | equemene | CALL DAXPY( N, -TAU, WORK, 1, C, LDC ) |
112 | 1 | equemene | * |
113 | 1 | equemene | * C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... |
114 | 1 | equemene | * tau * v( 1:l ) * w( 1:n )' |
115 | 1 | equemene | * |
116 | 1 | equemene | CALL DGER( L, N, -TAU, V, INCV, WORK, 1, C( M-L+1, 1 ), |
117 | 1 | equemene | $ LDC ) |
118 | 1 | equemene | END IF |
119 | 1 | equemene | * |
120 | 1 | equemene | ELSE |
121 | 1 | equemene | * |
122 | 1 | equemene | * Form C * H |
123 | 1 | equemene | * |
124 | 1 | equemene | IF( TAU.NE.ZERO ) THEN |
125 | 1 | equemene | * |
126 | 1 | equemene | * w( 1:m ) = C( 1:m, 1 ) |
127 | 1 | equemene | * |
128 | 1 | equemene | CALL DCOPY( M, C, 1, WORK, 1 ) |
129 | 1 | equemene | * |
130 | 1 | equemene | * w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l ) |
131 | 1 | equemene | * |
132 | 1 | equemene | CALL DGEMV( 'No transpose', M, L, ONE, C( 1, N-L+1 ), LDC, |
133 | 1 | equemene | $ V, INCV, ONE, WORK, 1 ) |
134 | 1 | equemene | * |
135 | 1 | equemene | * C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m ) |
136 | 1 | equemene | * |
137 | 1 | equemene | CALL DAXPY( M, -TAU, WORK, 1, C, 1 ) |
138 | 1 | equemene | * |
139 | 1 | equemene | * C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... |
140 | 1 | equemene | * tau * w( 1:m ) * v( 1:l )' |
141 | 1 | equemene | * |
142 | 1 | equemene | CALL DGER( M, L, -TAU, WORK, 1, V, INCV, C( 1, N-L+1 ), |
143 | 1 | equemene | $ LDC ) |
144 | 1 | equemene | * |
145 | 1 | equemene | END IF |
146 | 1 | equemene | * |
147 | 1 | equemene | END IF |
148 | 1 | equemene | * |
149 | 1 | equemene | RETURN |
150 | 1 | equemene | * |
151 | 1 | equemene | * End of DLARZ |
152 | 1 | equemene | * |
153 | 1 | equemene | END |