1
*> \brief \b DLARFB applies a block reflector or its transpose to a general rectangular matrix.
3
* =========== DOCUMENTATION ===========
5
* Online html documentation available at
6
* http://www.netlib.org/lapack/explore-html/
9
*> Download DLARFB + dependencies
10
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfb.f">
12
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfb.f">
14
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfb.f">
21
* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
22
* T, LDT, C, LDC, WORK, LDWORK )
24
* .. Scalar Arguments ..
25
* CHARACTER DIRECT, SIDE, STOREV, TRANS
26
* INTEGER K, LDC, LDT, LDV, LDWORK, M, N
28
* .. Array Arguments ..
29
* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ),
39
*> DLARFB applies a real block reflector H or its transpose H**T to a
40
*> real m by n matrix C, from either the left or the right.
48
*> SIDE is CHARACTER*1
49
*> = 'L': apply H or H**T from the Left
50
*> = 'R': apply H or H**T from the Right
55
*> TRANS is CHARACTER*1
56
*> = 'N': apply H (No transpose)
57
*> = 'T': apply H**T (Transpose)
62
*> DIRECT is CHARACTER*1
63
*> Indicates how H is formed from a product of elementary
65
*> = 'F': H = H(1) H(2) . . . H(k) (Forward)
66
*> = 'B': H = H(k) . . . H(2) H(1) (Backward)
71
*> STOREV is CHARACTER*1
72
*> Indicates how the vectors which define the elementary
73
*> reflectors are stored:
81
*> The number of rows of the matrix C.
87
*> The number of columns of the matrix C.
93
*> The order of the matrix T (= the number of elementary
94
*> reflectors whose product defines the block reflector).
99
*> V is DOUBLE PRECISION array, dimension
100
*> (LDV,K) if STOREV = 'C'
101
*> (LDV,M) if STOREV = 'R' and SIDE = 'L'
102
*> (LDV,N) if STOREV = 'R' and SIDE = 'R'
103
*> The matrix V. See Further Details.
109
*> The leading dimension of the array V.
110
*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
111
*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
112
*> if STOREV = 'R', LDV >= K.
117
*> T is DOUBLE PRECISION array, dimension (LDT,K)
118
*> The triangular k by k matrix T in the representation of the
125
*> The leading dimension of the array T. LDT >= K.
130
*> C is DOUBLE PRECISION array, dimension (LDC,N)
131
*> On entry, the m by n matrix C.
132
*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T.
138
*> The leading dimension of the array C. LDC >= max(1,M).
143
*> WORK is DOUBLE PRECISION array, dimension (LDWORK,K)
149
*> The leading dimension of the array WORK.
150
*> If SIDE = 'L', LDWORK >= max(1,N);
151
*> if SIDE = 'R', LDWORK >= max(1,M).
157
*> \author Univ. of Tennessee
158
*> \author Univ. of California Berkeley
159
*> \author Univ. of Colorado Denver
162
*> \date September 2012
164
*> \ingroup doubleOTHERauxiliary
166
*> \par Further Details:
167
* =====================
171
*> The shape of the matrix V and the storage of the vectors which define
172
*> the H(i) is best illustrated by the following example with n = 5 and
173
*> k = 3. The elements equal to 1 are not stored; the corresponding
174
*> array elements are modified but restored on exit. The rest of the
175
*> array is not used.
177
*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R':
179
*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 )
180
*> ( v1 1 ) ( 1 v2 v2 v2 )
181
*> ( v1 v2 1 ) ( 1 v3 v3 )
185
*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R':
187
*> V = ( v1 v2 v3 ) V = ( v1 v1 1 )
188
*> ( v1 v2 v3 ) ( v2 v2 v2 1 )
189
*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 )
194
* =====================================================================
1
195
SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
2
196
$ T, LDT, C, LDC, WORK, LDWORK )
4
* -- LAPACK auxiliary routine (version 2.0) --
5
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
6
* Courant Institute, Argonne National Lab, and Rice University
198
* -- LAPACK auxiliary routine (version 3.4.2) --
199
* -- LAPACK is a software package provided by Univ. of Tennessee, --
200
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
9
203
* .. Scalar Arguments ..
10
204
CHARACTER DIRECT, SIDE, STOREV, TRANS
15
209
$ WORK( LDWORK, * )
19
* $Id: dlarfb.f 19697 2010-10-29 16:57:34Z d3y133 $
24
* DLARFB applies a real block reflector H or its transpose H' to a
25
* real m by n matrix C, from either the left or the right.
30
* SIDE (input) CHARACTER*1
31
* = 'L': apply H or H' from the Left
32
* = 'R': apply H or H' from the Right
34
* TRANS (input) CHARACTER*1
35
* = 'N': apply H (No transpose)
36
* = 'T': apply H' (Transpose)
38
* DIRECT (input) CHARACTER*1
39
* Indicates how H is formed from a product of elementary
41
* = 'F': H = H(1) H(2) . . . H(k) (Forward)
42
* = 'B': H = H(k) . . . H(2) H(1) (Backward)
44
* STOREV (input) CHARACTER*1
45
* Indicates how the vectors which define the elementary
46
* reflectors are stored:
51
* The number of rows of the matrix C.
54
* The number of columns of the matrix C.
57
* The order of the matrix T (= the number of elementary
58
* reflectors whose product defines the block reflector).
60
* V (input) DOUBLE PRECISION array, dimension
61
* (LDV,K) if STOREV = 'C'
62
* (LDV,M) if STOREV = 'R' and SIDE = 'L'
63
* (LDV,N) if STOREV = 'R' and SIDE = 'R'
64
* The matrix V. See further details.
67
* The leading dimension of the array V.
68
* If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
69
* if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
70
* if STOREV = 'R', LDV >= K.
72
* T (input) DOUBLE PRECISION array, dimension (LDT,K)
73
* The triangular k by k matrix T in the representation of the
77
* The leading dimension of the array T. LDT >= K.
79
* C (input/output) DOUBLE PRECISION array, dimension (LDC,N)
80
* On entry, the m by n matrix C.
81
* On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
84
* The leading dimension of the array C. LDA >= max(1,M).
86
* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K)
88
* LDWORK (input) INTEGER
89
* The leading dimension of the array WORK.
90
* If SIDE = 'L', LDWORK >= max(1,N);
91
* if SIDE = 'R', LDWORK >= max(1,M).
93
212
* =====================================================================
95
214
* .. Parameters ..
131
251
IF( LSAME( SIDE, 'L' ) ) THEN
133
* Form H * C or H' * C where C = ( C1 )
136
* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK)
253
* Form H * C or H**T * C where C = ( C1 )
256
LASTV = MAX( K, ILADLR( M, K, V, LDV ) )
257
LASTC = ILADLC( LASTV, N, C, LDC )
259
* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK)
141
CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
264
CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
146
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
147
$ K, ONE, V, LDV, WORK, LDWORK )
152
CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K,
153
$ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
154
$ ONE, WORK, LDWORK )
157
* W := W * T' or W * T
159
CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
160
$ ONE, T, LDT, WORK, LDWORK )
168
CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K,
169
$ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
175
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
176
$ ONE, V, LDV, WORK, LDWORK )
269
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
270
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
271
IF( LASTV.GT.K ) THEN
275
CALL DGEMM( 'Transpose', 'No transpose',
277
$ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
278
$ ONE, WORK, LDWORK )
281
* W := W * T**T or W * T
283
CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
284
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
288
IF( LASTV.GT.K ) THEN
290
* C2 := C2 - V2 * W**T
292
CALL DGEMM( 'No transpose', 'Transpose',
294
$ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
300
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
301
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
182
307
C( J, I ) = C( J, I ) - WORK( I, J )
186
311
ELSE IF( LSAME( SIDE, 'R' ) ) THEN
188
* Form C * H or C * H' where C = ( C1 C2 )
313
* Form C * H or C * H**T where C = ( C1 C2 )
315
LASTV = MAX( K, ILADLR( N, K, V, LDV ) )
316
LASTC = ILADLR( M, LASTV, C, LDC )
190
318
* W := C * V = (C1*V1 + C2*V2) (stored in WORK)
195
CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
323
CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
200
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
201
$ K, ONE, V, LDV, WORK, LDWORK )
328
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
329
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
330
IF( LASTV.GT.K ) THEN
204
332
* W := W + C2 * V2
206
CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K,
207
$ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
208
$ ONE, WORK, LDWORK )
211
* W := W * T or W * T'
213
CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
214
$ ONE, T, LDT, WORK, LDWORK )
222
CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K,
223
$ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
229
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
230
$ ONE, V, LDV, WORK, LDWORK )
334
CALL DGEMM( 'No transpose', 'No transpose',
336
$ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
337
$ ONE, WORK, LDWORK )
340
* W := W * T or W * T**T
342
CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
343
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
347
IF( LASTV.GT.K ) THEN
349
* C2 := C2 - W * V2**T
351
CALL DGEMM( 'No transpose', 'Transpose',
353
$ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
359
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
360
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
236
366
C( I, J ) = C( I, J ) - WORK( I, J )
247
377
IF( LSAME( SIDE, 'L' ) ) THEN
249
* Form H * C or H' * C where C = ( C1 )
252
* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK)
379
* Form H * C or H**T * C where C = ( C1 )
382
LASTC = ILADLC( M, N, C, LDC )
384
* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK)
257
CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
389
CALL DCOPY( LASTC, C( M-K+J, 1 ), LDC,
262
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
263
$ K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
268
CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K,
269
$ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
272
* W := W * T' or W * T
274
CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
275
$ ONE, T, LDT, WORK, LDWORK )
283
CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K,
284
$ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
289
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
290
$ ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
395
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
396
$ LASTC, K, ONE, V( M-K+1, 1 ), LDV,
402
CALL DGEMM( 'Transpose', 'No transpose',
403
$ LASTC, K, M-K, ONE, C, LDC, V, LDV,
404
$ ONE, WORK, LDWORK )
407
* W := W * T**T or W * T
409
CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
410
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
416
* C1 := C1 - V1 * W**T
418
CALL DGEMM( 'No transpose', 'Transpose',
419
$ M-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
425
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
426
$ LASTC, K, ONE, V( M-K+1, 1 ), LDV,
296
C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
433
C( M-K+J, I ) = C( M-K+J, I ) - WORK(I, J)
300
437
ELSE IF( LSAME( SIDE, 'R' ) ) THEN
302
* Form C * H or C * H' where C = ( C1 C2 )
439
* Form C * H or C * H**T where C = ( C1 C2 )
441
LASTC = ILADLR( M, N, C, LDC )
304
443
* W := C * V = (C1*V1 + C2*V2) (stored in WORK)
309
CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
448
CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
314
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
315
$ K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
453
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
454
$ LASTC, K, ONE, V( N-K+1, 1 ), LDV,
316
456
IF( N.GT.K ) THEN
318
458
* W := W + C1 * V1
320
CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K,
321
$ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
460
CALL DGEMM( 'No transpose', 'No transpose',
461
$ LASTC, K, N-K, ONE, C, LDC, V, LDV,
462
$ ONE, WORK, LDWORK )
324
* W := W * T or W * T'
326
CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
327
$ ONE, T, LDT, WORK, LDWORK )
465
* W := W * T or W * T**T
467
CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
468
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
331
472
IF( N.GT.K ) THEN
474
* C1 := C1 - W * V1**T
335
CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K,
336
$ -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
476
CALL DGEMM( 'No transpose', 'Transpose',
477
$ LASTC, N-K, K, -ONE, WORK, LDWORK, V, LDV,
341
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
342
$ ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
483
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
484
$ LASTC, K, ONE, V( N-K+1, 1 ), LDV,
348
C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
491
C( I, N-K+J ) = C( I, N-K+J ) - WORK(I, J)
361
504
IF( LSAME( SIDE, 'L' ) ) THEN
363
* Form H * C or H' * C where C = ( C1 )
366
* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK)
506
* Form H * C or H**T * C where C = ( C1 )
509
LASTV = MAX( K, ILADLC( K, M, V, LDV ) )
510
LASTC = ILADLC( LASTV, N, C, LDC )
512
* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK)
371
CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
517
CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
376
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
377
$ ONE, V, LDV, WORK, LDWORK )
382
CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
383
$ C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE,
522
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
523
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
524
IF( LASTV.GT.K ) THEN
526
* W := W + C2**T*V2**T
528
CALL DGEMM( 'Transpose', 'Transpose',
530
$ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
531
$ ONE, WORK, LDWORK )
387
* W := W * T' or W * T
389
CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
390
$ ONE, T, LDT, WORK, LDWORK )
396
* C2 := C2 - V2' * W'
398
CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
399
$ V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
534
* W := W * T**T or W * T
536
CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
537
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
539
* C := C - V**T * W**T
541
IF( LASTV.GT.K ) THEN
543
* C2 := C2 - V2**T * W**T
545
CALL DGEMM( 'Transpose', 'Transpose',
547
$ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
548
$ ONE, C( K+1, 1 ), LDC )
405
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
406
$ K, ONE, V, LDV, WORK, LDWORK )
553
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
554
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
412
560
C( J, I ) = C( J, I ) - WORK( I, J )
416
564
ELSE IF( LSAME( SIDE, 'R' ) ) THEN
418
* Form C * H or C * H' where C = ( C1 C2 )
420
* W := C * V' = (C1*V1' + C2*V2') (stored in WORK)
566
* Form C * H or C * H**T where C = ( C1 C2 )
568
LASTV = MAX( K, ILADLC( K, N, V, LDV ) )
569
LASTC = ILADLR( M, LASTV, C, LDC )
571
* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK)
425
CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
576
CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
430
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
431
$ ONE, V, LDV, WORK, LDWORK )
436
CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K,
437
$ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
438
$ ONE, WORK, LDWORK )
581
CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
582
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
583
IF( LASTV.GT.K ) THEN
585
* W := W + C2 * V2**T
587
CALL DGEMM( 'No transpose', 'Transpose',
589
$ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
590
$ ONE, WORK, LDWORK )
441
* W := W * T or W * T'
593
* W := W * T or W * T**T
443
CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
444
$ ONE, T, LDT, WORK, LDWORK )
595
CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
596
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
600
IF( LASTV.GT.K ) THEN
450
602
* C2 := C2 - W * V2
452
CALL DGEMM( 'No transpose', 'No transpose', M, N-K, K,
453
$ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
604
CALL DGEMM( 'No transpose', 'No transpose',
606
$ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
607
$ ONE, C( 1, K+1 ), LDC )
459
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
460
$ K, ONE, V, LDV, WORK, LDWORK )
612
CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
613
$ LASTC, K, ONE, V, LDV, WORK, LDWORK )
466
619
C( I, J ) = C( I, J ) - WORK( I, J )
477
630
IF( LSAME( SIDE, 'L' ) ) THEN
479
* Form H * C or H' * C where C = ( C1 )
482
* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK)
632
* Form H * C or H**T * C where C = ( C1 )
635
LASTC = ILADLC( M, N, C, LDC )
637
* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK)
487
CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
642
CALL DCOPY( LASTC, C( M-K+J, 1 ), LDC,
492
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
493
$ ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
648
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
649
$ LASTC, K, ONE, V( 1, M-K+1 ), LDV,
494
651
IF( M.GT.K ) THEN
653
* W := W + C1**T * V1**T
498
CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
499
$ C, LDC, V, LDV, ONE, WORK, LDWORK )
655
CALL DGEMM( 'Transpose', 'Transpose',
656
$ LASTC, K, M-K, ONE, C, LDC, V, LDV,
657
$ ONE, WORK, LDWORK )
502
* W := W * T' or W * T
504
CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
505
$ ONE, T, LDT, WORK, LDWORK )
660
* W := W * T**T or W * T
662
CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
663
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )
665
* C := C - V**T * W**T
509
667
IF( M.GT.K ) THEN
511
* C1 := C1 - V1' * W'
669
* C1 := C1 - V1**T * W**T
513
CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
514
$ V, LDV, WORK, LDWORK, ONE, C, LDC )
671
CALL DGEMM( 'Transpose', 'Transpose',
672
$ M-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
519
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
520
$ K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
678
CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
679
$ LASTC, K, ONE, V( 1, M-K+1 ), LDV,
526
C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
686
C( M-K+J, I ) = C( M-K+J, I ) - WORK(I, J)
530
690
ELSE IF( LSAME( SIDE, 'R' ) ) THEN
532
* Form C * H or C * H' where C = ( C1 C2 )
534
* W := C * V' = (C1*V1' + C2*V2') (stored in WORK)
692
* Form C * H or C * H**T where C = ( C1 C2 )
694
LASTC = ILADLR( M, N, C, LDC )
696
* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK)
539
CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
701
CALL DCOPY( LASTC, C( 1, N-K+J ), 1,
544
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
545
$ ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
707
CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
708
$ LASTC, K, ONE, V( 1, N-K+1 ), LDV,
546
710
IF( N.GT.K ) THEN
712
* W := W + C1 * V1**T
550
CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K,
551
$ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
714
CALL DGEMM( 'No transpose', 'Transpose',
715
$ LASTC, K, N-K, ONE, C, LDC, V, LDV,
716
$ ONE, WORK, LDWORK )
554
* W := W * T or W * T'
719
* W := W * T or W * T**T
556
CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
557
$ ONE, T, LDT, WORK, LDWORK )
721
CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
722
$ LASTC, K, ONE, T, LDT, WORK, LDWORK )