1
SUBROUTINE MB04NY( M, N, V, INCV, TAU, A, LDA, B, LDB, DWORK )
3
C RELEASE 4.0, WGS COPYRIGHT 1999.
7
C To apply a real elementary reflector H to a real m-by-(n+1)
8
C matrix C = [ A B ], from the right, where A has one column. H is
9
C represented in the form
11
C H = I - tau * u *u', u = ( ),
13
C where tau is a real scalar and v is a real n-vector.
15
C If tau = 0, then H is taken to be the unit matrix.
17
C In-line code is used if H has order < 11.
21
C Input/Output Parameters
24
C The number of rows of the matrices A and B. M >= 0.
27
C The number of columns of the matrix B. N >= 0.
29
C V (input) DOUBLE PRECISION array, dimension
30
C (1+(N-1)*ABS( INCV ))
31
C The vector v in the representation of H.
33
C INCV (input) INTEGER
34
C The increment between the elements of v. INCV <> 0.
36
C TAU (input) DOUBLE PRECISION
37
C The scalar factor of the elementary reflector H.
39
C A (input/output) DOUBLE PRECISION array, dimension (LDA,1)
40
C On entry, the leading M-by-1 part of this array must
41
C contain the matrix A.
42
C On exit, the leading M-by-1 part of this array contains
43
C the updated matrix A (the first column of C * H).
46
C The leading dimension of array A. LDA >= MAX(1,M).
48
C B (input/output) DOUBLE PRECISION array, dimension (LDB,N)
49
C On entry, the leading M-by-N part of this array must
50
C contain the matrix B.
51
C On exit, the leading M-by-N part of this array contains
52
C the updated matrix B (the last n columns of C * H).
55
C The leading dimension of array B. LDB >= MAX(1,M).
59
C DWORK DOUBLE PRECISION array, dimension (M)
60
C DWORK is not referenced if H has order less than 11.
64
C The routine applies the elementary reflector H, taking the special
65
C structure of C into account.
69
C The algorithm is backward stable.
73
C V. Sima, Katholieke Univ. Leuven, Belgium, Apr. 1998.
74
C Based on LAPACK routines DLARFX and DLATZM.
82
C Elementary matrix operations, elementary reflector, orthogonal
85
C ******************************************************************
88
DOUBLE PRECISION ZERO, ONE
89
PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
90
C .. Scalar Arguments ..
91
INTEGER INCV, LDA, LDB, M, N
93
C .. Array Arguments ..
94
DOUBLE PRECISION A( LDA, * ), B( LDB, * ), DWORK( * ), V( * )
97
DOUBLE PRECISION SUM, T1, T2, T3, T4, T5, T6, T7, T8, T9, V1, V2,
98
$ V3, V4, V5, V6, V7, V8, V9
99
C .. External Subroutines ..
100
EXTERNAL DAXPY, DCOPY, DGEMV, DGER
102
C .. Executable Statements ..
107
C Form C * H, where H has order n+1.
109
GO TO ( 10, 30, 50, 70, 90, 110, 130, 150,
112
C Code for general N. Compute
114
C w := C*u, C := C - tau * w * u'.
116
CALL DCOPY( M, A, 1, DWORK, 1 )
117
CALL DGEMV( 'No transpose', M, N, ONE, B, LDB, V, INCV, ONE,
119
CALL DAXPY( M, -TAU, DWORK, 1, A, 1 )
120
CALL DGER( M, N, -TAU, DWORK, 1, V, INCV, B, LDB )
124
C Special code for 1 x 1 Householder
128
A( J, 1 ) = T1*A( J, 1 )
133
C Special code for 2 x 2 Householder
137
$ IV = (-N+1)*INCV + 1
141
SUM = A( J, 1 ) + V1*B( J, 1 )
142
A( J, 1 ) = A( J, 1 ) - SUM*TAU
143
B( J, 1 ) = B( J, 1 ) - SUM*T1
148
C Special code for 3 x 3 Householder
152
$ IV = (-N+1)*INCV + 1
159
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 )
160
A( J, 1 ) = A( J, 1 ) - SUM*TAU
161
B( J, 1 ) = B( J, 1 ) - SUM*T1
162
B( J, 2 ) = B( J, 2 ) - SUM*T2
167
C Special code for 4 x 4 Householder
171
$ IV = (-N+1)*INCV + 1
181
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 )
182
A( J, 1 ) = A( J, 1 ) - SUM*TAU
183
B( J, 1 ) = B( J, 1 ) - SUM*T1
184
B( J, 2 ) = B( J, 2 ) - SUM*T2
185
B( J, 3 ) = B( J, 3 ) - SUM*T3
190
C Special code for 5 x 5 Householder
194
$ IV = (-N+1)*INCV + 1
207
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
209
A( J, 1 ) = A( J, 1 ) - SUM*TAU
210
B( J, 1 ) = B( J, 1 ) - SUM*T1
211
B( J, 2 ) = B( J, 2 ) - SUM*T2
212
B( J, 3 ) = B( J, 3 ) - SUM*T3
213
B( J, 4 ) = B( J, 4 ) - SUM*T4
218
C Special code for 6 x 6 Householder
222
$ IV = (-N+1)*INCV + 1
238
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
239
$ V4*B( J, 4 ) + V5*B( J, 5 )
240
A( J, 1 ) = A( J, 1 ) - SUM*TAU
241
B( J, 1 ) = B( J, 1 ) - SUM*T1
242
B( J, 2 ) = B( J, 2 ) - SUM*T2
243
B( J, 3 ) = B( J, 3 ) - SUM*T3
244
B( J, 4 ) = B( J, 4 ) - SUM*T4
245
B( J, 5 ) = B( J, 5 ) - SUM*T5
250
C Special code for 7 x 7 Householder
254
$ IV = (-N+1)*INCV + 1
273
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
274
$ V4*B( J, 4 ) + V5*B( J, 5 ) + V6*B( J, 6 )
275
A( J, 1 ) = A( J, 1 ) - SUM*TAU
276
B( J, 1 ) = B( J, 1 ) - SUM*T1
277
B( J, 2 ) = B( J, 2 ) - SUM*T2
278
B( J, 3 ) = B( J, 3 ) - SUM*T3
279
B( J, 4 ) = B( J, 4 ) - SUM*T4
280
B( J, 5 ) = B( J, 5 ) - SUM*T5
281
B( J, 6 ) = B( J, 6 ) - SUM*T6
286
C Special code for 8 x 8 Householder
290
$ IV = (-N+1)*INCV + 1
312
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
313
$ V4*B( J, 4 ) + V5*B( J, 5 ) + V6*B( J, 6 ) +
315
A( J, 1 ) = A( J, 1 ) - SUM*TAU
316
B( J, 1 ) = B( J, 1 ) - SUM*T1
317
B( J, 2 ) = B( J, 2 ) - SUM*T2
318
B( J, 3 ) = B( J, 3 ) - SUM*T3
319
B( J, 4 ) = B( J, 4 ) - SUM*T4
320
B( J, 5 ) = B( J, 5 ) - SUM*T5
321
B( J, 6 ) = B( J, 6 ) - SUM*T6
322
B( J, 7 ) = B( J, 7 ) - SUM*T7
327
C Special code for 9 x 9 Householder
331
$ IV = (-N+1)*INCV + 1
356
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
357
$ V4*B( J, 4 ) + V5*B( J, 5 ) + V6*B( J, 6 ) +
358
$ V7*B( J, 7 ) + V8*B( J, 8 )
359
A( J, 1 ) = A( J, 1 ) - SUM*TAU
360
B( J, 1 ) = B( J, 1 ) - SUM*T1
361
B( J, 2 ) = B( J, 2 ) - SUM*T2
362
B( J, 3 ) = B( J, 3 ) - SUM*T3
363
B( J, 4 ) = B( J, 4 ) - SUM*T4
364
B( J, 5 ) = B( J, 5 ) - SUM*T5
365
B( J, 6 ) = B( J, 6 ) - SUM*T6
366
B( J, 7 ) = B( J, 7 ) - SUM*T7
367
B( J, 8 ) = B( J, 8 ) - SUM*T8
372
C Special code for 10 x 10 Householder
376
$ IV = (-N+1)*INCV + 1
404
SUM = A( J, 1 ) + V1*B( J, 1 ) + V2*B( J, 2 ) + V3*B( J, 3 ) +
405
$ V4*B( J, 4 ) + V5*B( J, 5 ) + V6*B( J, 6 ) +
406
$ V7*B( J, 7 ) + V8*B( J, 8 ) + V9*B( J, 9 )
407
A( J, 1 ) = A( J, 1 ) - SUM*TAU
408
B( J, 1 ) = B( J, 1 ) - SUM*T1
409
B( J, 2 ) = B( J, 2 ) - SUM*T2
410
B( J, 3 ) = B( J, 3 ) - SUM*T3
411
B( J, 4 ) = B( J, 4 ) - SUM*T4
412
B( J, 5 ) = B( J, 5 ) - SUM*T5
413
B( J, 6 ) = B( J, 6 ) - SUM*T6
414
B( J, 7 ) = B( J, 7 ) - SUM*T7
415
B( J, 8 ) = B( J, 8 ) - SUM*T8
416
B( J, 9 ) = B( J, 9 ) - SUM*T9
420
C *** Last line of MB04NY ***