blob: 40bbdf48783eaae73a2ca9e744996c264ed006d5 [file] [log] [blame]
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -07001*> \brief \b CLARFB
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download CLARFB + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfb.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfb.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfb.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
22* T, LDT, C, LDC, WORK, LDWORK )
23*
24* .. Scalar Arguments ..
25* CHARACTER DIRECT, SIDE, STOREV, TRANS
26* INTEGER K, LDC, LDT, LDV, LDWORK, M, N
27* ..
28* .. Array Arguments ..
29* COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ),
30* $ WORK( LDWORK, * )
31* ..
32*
33*
34*> \par Purpose:
35* =============
36*>
37*> \verbatim
38*>
39*> CLARFB applies a complex block reflector H or its transpose H**H to a
40*> complex M-by-N matrix C, from either the left or the right.
41*> \endverbatim
42*
43* Arguments:
44* ==========
45*
46*> \param[in] SIDE
47*> \verbatim
48*> SIDE is CHARACTER*1
49*> = 'L': apply H or H**H from the Left
50*> = 'R': apply H or H**H from the Right
51*> \endverbatim
52*>
53*> \param[in] TRANS
54*> \verbatim
55*> TRANS is CHARACTER*1
56*> = 'N': apply H (No transpose)
57*> = 'C': apply H**H (Conjugate transpose)
58*> \endverbatim
59*>
60*> \param[in] DIRECT
61*> \verbatim
62*> DIRECT is CHARACTER*1
63*> Indicates how H is formed from a product of elementary
64*> reflectors
65*> = 'F': H = H(1) H(2) . . . H(k) (Forward)
66*> = 'B': H = H(k) . . . H(2) H(1) (Backward)
67*> \endverbatim
68*>
69*> \param[in] STOREV
70*> \verbatim
71*> STOREV is CHARACTER*1
72*> Indicates how the vectors which define the elementary
73*> reflectors are stored:
74*> = 'C': Columnwise
75*> = 'R': Rowwise
76*> \endverbatim
77*>
78*> \param[in] M
79*> \verbatim
80*> M is INTEGER
81*> The number of rows of the matrix C.
82*> \endverbatim
83*>
84*> \param[in] N
85*> \verbatim
86*> N is INTEGER
87*> The number of columns of the matrix C.
88*> \endverbatim
89*>
90*> \param[in] K
91*> \verbatim
92*> K is INTEGER
93*> The order of the matrix T (= the number of elementary
94*> reflectors whose product defines the block reflector).
95*> \endverbatim
96*>
97*> \param[in] V
98*> \verbatim
99*> V is COMPLEX 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.
104*> \endverbatim
105*>
106*> \param[in] LDV
107*> \verbatim
108*> LDV is INTEGER
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.
113*> \endverbatim
114*>
115*> \param[in] T
116*> \verbatim
117*> T is COMPLEX array, dimension (LDT,K)
118*> The triangular K-by-K matrix T in the representation of the
119*> block reflector.
120*> \endverbatim
121*>
122*> \param[in] LDT
123*> \verbatim
124*> LDT is INTEGER
125*> The leading dimension of the array T. LDT >= K.
126*> \endverbatim
127*>
128*> \param[in,out] C
129*> \verbatim
130*> C is COMPLEX array, dimension (LDC,N)
131*> On entry, the M-by-N matrix C.
132*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H.
133*> \endverbatim
134*>
135*> \param[in] LDC
136*> \verbatim
137*> LDC is INTEGER
138*> The leading dimension of the array C. LDC >= max(1,M).
139*> \endverbatim
140*>
141*> \param[out] WORK
142*> \verbatim
143*> WORK is COMPLEX array, dimension (LDWORK,K)
144*> \endverbatim
145*>
146*> \param[in] LDWORK
147*> \verbatim
148*> LDWORK is INTEGER
149*> The leading dimension of the array WORK.
150*> If SIDE = 'L', LDWORK >= max(1,N);
151*> if SIDE = 'R', LDWORK >= max(1,M).
152*> \endverbatim
153*
154* Authors:
155* ========
156*
157*> \author Univ. of Tennessee
158*> \author Univ. of California Berkeley
159*> \author Univ. of Colorado Denver
160*> \author NAG Ltd.
161*
162*> \date November 2011
163*
164*> \ingroup complexOTHERauxiliary
165*
166*> \par Further Details:
167* =====================
168*>
169*> \verbatim
170*>
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.
176*>
177*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R':
178*>
179*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 )
180*> ( v1 1 ) ( 1 v2 v2 v2 )
181*> ( v1 v2 1 ) ( 1 v3 v3 )
182*> ( v1 v2 v3 )
183*> ( v1 v2 v3 )
184*>
185*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R':
186*>
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 )
190*> ( 1 v3 )
191*> ( 1 )
192*> \endverbatim
193*>
194* =====================================================================
195 SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
196 $ T, LDT, C, LDC, WORK, LDWORK )
197*
198* -- LAPACK auxiliary routine (version 3.4.0) --
199* -- LAPACK is a software package provided by Univ. of Tennessee, --
200* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
201* November 2011
202*
203* .. Scalar Arguments ..
204 CHARACTER DIRECT, SIDE, STOREV, TRANS
205 INTEGER K, LDC, LDT, LDV, LDWORK, M, N
206* ..
207* .. Array Arguments ..
208 COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ),
209 $ WORK( LDWORK, * )
210* ..
211*
212* =====================================================================
213*
214* .. Parameters ..
215 COMPLEX ONE
216 PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) )
217* ..
218* .. Local Scalars ..
219 CHARACTER TRANST
220 INTEGER I, J, LASTV, LASTC
221* ..
222* .. External Functions ..
223 LOGICAL LSAME
224 INTEGER ILACLR, ILACLC
225 EXTERNAL LSAME, ILACLR, ILACLC
226* ..
227* .. External Subroutines ..
228 EXTERNAL CCOPY, CGEMM, CLACGV, CTRMM
229* ..
230* .. Intrinsic Functions ..
231 INTRINSIC CONJG
232* ..
233* .. Executable Statements ..
234*
235* Quick return if possible
236*
237 IF( M.LE.0 .OR. N.LE.0 )
238 $ RETURN
239*
240 IF( LSAME( TRANS, 'N' ) ) THEN
241 TRANST = 'C'
242 ELSE
243 TRANST = 'N'
244 END IF
245*
246 IF( LSAME( STOREV, 'C' ) ) THEN
247*
248 IF( LSAME( DIRECT, 'F' ) ) THEN
249*
250* Let V = ( V1 ) (first K rows)
251* ( V2 )
252* where V1 is unit lower triangular.
253*
254 IF( LSAME( SIDE, 'L' ) ) THEN
255*
256* Form H * C or H**H * C where C = ( C1 )
257* ( C2 )
258*
259 LASTV = MAX( K, ILACLR( M, K, V, LDV ) )
260 LASTC = ILACLC( LASTV, N, C, LDC )
261*
262* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK)
263*
264* W := C1**H
265*
266 DO 10 J = 1, K
267 CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
268 CALL CLACGV( LASTC, WORK( 1, J ), 1 )
269 10 CONTINUE
270*
271* W := W * V1
272*
273 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
274 $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
275 IF( LASTV.GT.K ) THEN
276*
277* W := W + C2**H *V2
278*
279 CALL CGEMM( 'Conjugate transpose', 'No transpose',
280 $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC,
281 $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
282 END IF
283*
284* W := W * T**H or W * T
285*
286 CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
287 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
288*
289* C := C - V * W**H
290*
291 IF( M.GT.K ) THEN
292*
293* C2 := C2 - V2 * W**H
294*
295 CALL CGEMM( 'No transpose', 'Conjugate transpose',
296 $ LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV,
297 $ WORK, LDWORK, ONE, C( K+1, 1 ), LDC )
298 END IF
299*
300* W := W * V1**H
301*
302 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
303 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
304*
305* C1 := C1 - W**H
306*
307 DO 30 J = 1, K
308 DO 20 I = 1, LASTC
309 C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )
310 20 CONTINUE
311 30 CONTINUE
312*
313 ELSE IF( LSAME( SIDE, 'R' ) ) THEN
314*
315* Form C * H or C * H**H where C = ( C1 C2 )
316*
317 LASTV = MAX( K, ILACLR( N, K, V, LDV ) )
318 LASTC = ILACLR( M, LASTV, C, LDC )
319*
320* W := C * V = (C1*V1 + C2*V2) (stored in WORK)
321*
322* W := C1
323*
324 DO 40 J = 1, K
325 CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
326 40 CONTINUE
327*
328* W := W * V1
329*
330 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
331 $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
332 IF( LASTV.GT.K ) THEN
333*
334* W := W + C2 * V2
335*
336 CALL CGEMM( 'No transpose', 'No transpose',
337 $ LASTC, K, LASTV-K,
338 $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
339 $ ONE, WORK, LDWORK )
340 END IF
341*
342* W := W * T or W * T**H
343*
344 CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
345 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
346*
347* C := C - W * V**H
348*
349 IF( LASTV.GT.K ) THEN
350*
351* C2 := C2 - W * V2**H
352*
353 CALL CGEMM( 'No transpose', 'Conjugate transpose',
354 $ LASTC, LASTV-K, K,
355 $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV,
356 $ ONE, C( 1, K+1 ), LDC )
357 END IF
358*
359* W := W * V1**H
360*
361 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
362 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
363*
364* C1 := C1 - W
365*
366 DO 60 J = 1, K
367 DO 50 I = 1, LASTC
368 C( I, J ) = C( I, J ) - WORK( I, J )
369 50 CONTINUE
370 60 CONTINUE
371 END IF
372*
373 ELSE
374*
375* Let V = ( V1 )
376* ( V2 ) (last K rows)
377* where V2 is unit upper triangular.
378*
379 IF( LSAME( SIDE, 'L' ) ) THEN
380*
381* Form H * C or H**H * C where C = ( C1 )
382* ( C2 )
383*
384 LASTV = MAX( K, ILACLR( M, K, V, LDV ) )
385 LASTC = ILACLC( LASTV, N, C, LDC )
386*
387* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK)
388*
389* W := C2**H
390*
391 DO 70 J = 1, K
392 CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
393 $ WORK( 1, J ), 1 )
394 CALL CLACGV( LASTC, WORK( 1, J ), 1 )
395 70 CONTINUE
396*
397* W := W * V2
398*
399 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
400 $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
401 $ WORK, LDWORK )
402 IF( LASTV.GT.K ) THEN
403*
404* W := W + C1**H*V1
405*
406 CALL CGEMM( 'Conjugate transpose', 'No transpose',
407 $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
408 $ ONE, WORK, LDWORK )
409 END IF
410*
411* W := W * T**H or W * T
412*
413 CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
414 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
415*
416* C := C - V * W**H
417*
418 IF( LASTV.GT.K ) THEN
419*
420* C1 := C1 - V1 * W**H
421*
422 CALL CGEMM( 'No transpose', 'Conjugate transpose',
423 $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
424 $ ONE, C, LDC )
425 END IF
426*
427* W := W * V2**H
428*
429 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
430 $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
431 $ WORK, LDWORK )
432*
433* C2 := C2 - W**H
434*
435 DO 90 J = 1, K
436 DO 80 I = 1, LASTC
437 C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
438 $ CONJG( WORK( I, J ) )
439 80 CONTINUE
440 90 CONTINUE
441*
442 ELSE IF( LSAME( SIDE, 'R' ) ) THEN
443*
444* Form C * H or C * H**H where C = ( C1 C2 )
445*
446 LASTV = MAX( K, ILACLR( N, K, V, LDV ) )
447 LASTC = ILACLR( M, LASTV, C, LDC )
448*
449* W := C * V = (C1*V1 + C2*V2) (stored in WORK)
450*
451* W := C2
452*
453 DO 100 J = 1, K
454 CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1,
455 $ WORK( 1, J ), 1 )
456 100 CONTINUE
457*
458* W := W * V2
459*
460 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
461 $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
462 $ WORK, LDWORK )
463 IF( LASTV.GT.K ) THEN
464*
465* W := W + C1 * V1
466*
467 CALL CGEMM( 'No transpose', 'No transpose',
468 $ LASTC, K, LASTV-K,
469 $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
470 END IF
471*
472* W := W * T or W * T**H
473*
474 CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
475 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
476*
477* C := C - W * V**H
478*
479 IF( LASTV.GT.K ) THEN
480*
481* C1 := C1 - W * V1**H
482*
483 CALL CGEMM( 'No transpose', 'Conjugate transpose',
484 $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
485 $ ONE, C, LDC )
486 END IF
487*
488* W := W * V2**H
489*
490 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
491 $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
492 $ WORK, LDWORK )
493*
494* C2 := C2 - W
495*
496 DO 120 J = 1, K
497 DO 110 I = 1, LASTC
498 C( I, LASTV-K+J ) = C( I, LASTV-K+J )
499 $ - WORK( I, J )
500 110 CONTINUE
501 120 CONTINUE
502 END IF
503 END IF
504*
505 ELSE IF( LSAME( STOREV, 'R' ) ) THEN
506*
507 IF( LSAME( DIRECT, 'F' ) ) THEN
508*
509* Let V = ( V1 V2 ) (V1: first K columns)
510* where V1 is unit upper triangular.
511*
512 IF( LSAME( SIDE, 'L' ) ) THEN
513*
514* Form H * C or H**H * C where C = ( C1 )
515* ( C2 )
516*
517 LASTV = MAX( K, ILACLC( K, M, V, LDV ) )
518 LASTC = ILACLC( LASTV, N, C, LDC )
519*
520* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
521*
522* W := C1**H
523*
524 DO 130 J = 1, K
525 CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
526 CALL CLACGV( LASTC, WORK( 1, J ), 1 )
527 130 CONTINUE
528*
529* W := W * V1**H
530*
531 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
532 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
533 IF( LASTV.GT.K ) THEN
534*
535* W := W + C2**H*V2**H
536*
537 CALL CGEMM( 'Conjugate transpose',
538 $ 'Conjugate transpose', LASTC, K, LASTV-K,
539 $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
540 $ ONE, WORK, LDWORK )
541 END IF
542*
543* W := W * T**H or W * T
544*
545 CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
546 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
547*
548* C := C - V**H * W**H
549*
550 IF( LASTV.GT.K ) THEN
551*
552* C2 := C2 - V2**H * W**H
553*
554 CALL CGEMM( 'Conjugate transpose',
555 $ 'Conjugate transpose', LASTV-K, LASTC, K,
556 $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
557 $ ONE, C( K+1, 1 ), LDC )
558 END IF
559*
560* W := W * V1
561*
562 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
563 $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
564*
565* C1 := C1 - W**H
566*
567 DO 150 J = 1, K
568 DO 140 I = 1, LASTC
569 C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )
570 140 CONTINUE
571 150 CONTINUE
572*
573 ELSE IF( LSAME( SIDE, 'R' ) ) THEN
574*
575* Form C * H or C * H**H where C = ( C1 C2 )
576*
577 LASTV = MAX( K, ILACLC( K, N, V, LDV ) )
578 LASTC = ILACLR( M, LASTV, C, LDC )
579*
580* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK)
581*
582* W := C1
583*
584 DO 160 J = 1, K
585 CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
586 160 CONTINUE
587*
588* W := W * V1**H
589*
590 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
591 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
592 IF( LASTV.GT.K ) THEN
593*
594* W := W + C2 * V2**H
595*
596 CALL CGEMM( 'No transpose', 'Conjugate transpose',
597 $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC,
598 $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
599 END IF
600*
601* W := W * T or W * T**H
602*
603 CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
604 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
605*
606* C := C - W * V
607*
608 IF( LASTV.GT.K ) THEN
609*
610* C2 := C2 - W * V2
611*
612 CALL CGEMM( 'No transpose', 'No transpose',
613 $ LASTC, LASTV-K, K,
614 $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
615 $ ONE, C( 1, K+1 ), LDC )
616 END IF
617*
618* W := W * V1
619*
620 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
621 $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
622*
623* C1 := C1 - W
624*
625 DO 180 J = 1, K
626 DO 170 I = 1, LASTC
627 C( I, J ) = C( I, J ) - WORK( I, J )
628 170 CONTINUE
629 180 CONTINUE
630*
631 END IF
632*
633 ELSE
634*
635* Let V = ( V1 V2 ) (V2: last K columns)
636* where V2 is unit lower triangular.
637*
638 IF( LSAME( SIDE, 'L' ) ) THEN
639*
640* Form H * C or H**H * C where C = ( C1 )
641* ( C2 )
642*
643 LASTV = MAX( K, ILACLC( K, M, V, LDV ) )
644 LASTC = ILACLC( LASTV, N, C, LDC )
645*
646* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
647*
648* W := C2**H
649*
650 DO 190 J = 1, K
651 CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
652 $ WORK( 1, J ), 1 )
653 CALL CLACGV( LASTC, WORK( 1, J ), 1 )
654 190 CONTINUE
655*
656* W := W * V2**H
657*
658 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
659 $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
660 $ WORK, LDWORK )
661 IF( LASTV.GT.K ) THEN
662*
663* W := W + C1**H * V1**H
664*
665 CALL CGEMM( 'Conjugate transpose',
666 $ 'Conjugate transpose', LASTC, K, LASTV-K,
667 $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
668 END IF
669*
670* W := W * T**H or W * T
671*
672 CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
673 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
674*
675* C := C - V**H * W**H
676*
677 IF( LASTV.GT.K ) THEN
678*
679* C1 := C1 - V1**H * W**H
680*
681 CALL CGEMM( 'Conjugate transpose',
682 $ 'Conjugate transpose', LASTV-K, LASTC, K,
683 $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
684 END IF
685*
686* W := W * V2
687*
688 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
689 $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
690 $ WORK, LDWORK )
691*
692* C2 := C2 - W**H
693*
694 DO 210 J = 1, K
695 DO 200 I = 1, LASTC
696 C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
697 $ CONJG( WORK( I, J ) )
698 200 CONTINUE
699 210 CONTINUE
700*
701 ELSE IF( LSAME( SIDE, 'R' ) ) THEN
702*
703* Form C * H or C * H**H where C = ( C1 C2 )
704*
705 LASTV = MAX( K, ILACLC( K, N, V, LDV ) )
706 LASTC = ILACLR( M, LASTV, C, LDC )
707*
708* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK)
709*
710* W := C2
711*
712 DO 220 J = 1, K
713 CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1,
714 $ WORK( 1, J ), 1 )
715 220 CONTINUE
716*
717* W := W * V2**H
718*
719 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
720 $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
721 $ WORK, LDWORK )
722 IF( LASTV.GT.K ) THEN
723*
724* W := W + C1 * V1**H
725*
726 CALL CGEMM( 'No transpose', 'Conjugate transpose',
727 $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE,
728 $ WORK, LDWORK )
729 END IF
730*
731* W := W * T or W * T**H
732*
733 CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
734 $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
735*
736* C := C - W * V
737*
738 IF( LASTV.GT.K ) THEN
739*
740* C1 := C1 - W * V1
741*
742 CALL CGEMM( 'No transpose', 'No transpose',
743 $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
744 $ ONE, C, LDC )
745 END IF
746*
747* W := W * V2
748*
749 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
750 $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
751 $ WORK, LDWORK )
752*
753* C1 := C1 - W
754*
755 DO 240 J = 1, K
756 DO 230 I = 1, LASTC
757 C( I, LASTV-K+J ) = C( I, LASTV-K+J )
758 $ - WORK( I, J )
759 230 CONTINUE
760 240 CONTINUE
761*
762 END IF
763*
764 END IF
765 END IF
766*
767 RETURN
768*
769* End of CLARFB
770*
771 END