LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
 All Files Functions Groups
zlarfb.f
Go to the documentation of this file.
1 *> \brief \b ZLARFB
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZLARFB + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfb.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarfb.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarfb.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE ZLARFB( 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*16 C( LDC, * ), T( LDT, * ), V( LDV, * ),
30 * $ WORK( LDWORK, * )
31 * ..
32 *
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> ZLARFB 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*16 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 *> 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*16 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*16 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*16 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 complex16OTHERauxiliary
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 zlarfb( 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*16 c( ldc, * ), t( ldt, * ), v( ldv, * ),
209  $ work( ldwork, * )
210 * ..
211 *
212 * =====================================================================
213 *
214 * .. Parameters ..
215  COMPLEX*16 one
216  parameter( one = ( 1.0d+0, 0.0d+0 ) )
217 * ..
218 * .. Local Scalars ..
219  CHARACTER transt
220  INTEGER i, j, lastv, lastc
221 * ..
222 * .. External Functions ..
223  LOGICAL lsame
224  INTEGER ilazlr, ilazlc
225  EXTERNAL lsame, ilazlr, ilazlc
226 * ..
227 * .. External Subroutines ..
228  EXTERNAL zcopy, zgemm, zlacgv, ztrmm
229 * ..
230 * .. Intrinsic Functions ..
231  INTRINSIC dconjg
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, ilazlr( m, k, v, ldv ) )
260  lastc = ilazlc( 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 zcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
268  CALL zlacgv( lastc, work( 1, j ), 1 )
269  10 CONTINUE
270 *
271 * W := W * V1
272 *
273  CALL ztrmm( '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 zgemm( '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 ztrmm( '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 zgemm( 'No transpose', 'Conjugate transpose',
296  $ lastv-k, lastc, k,
297  $ -one, v( k+1, 1 ), ldv, work, ldwork,
298  $ one, c( k+1, 1 ), ldc )
299  END IF
300 *
301 * W := W * V1**H
302 *
303  CALL ztrmm( 'Right', 'Lower', 'Conjugate transpose',
304  $ 'Unit', lastc, k, one, v, ldv, work, ldwork )
305 *
306 * C1 := C1 - W**H
307 *
308  DO 30 j = 1, k
309  DO 20 i = 1, lastc
310  c( j, i ) = c( j, i ) - dconjg( work( i, j ) )
311  20 CONTINUE
312  30 CONTINUE
313 *
314  ELSE IF( lsame( side, 'R' ) ) THEN
315 *
316 * Form C * H or C * H**H where C = ( C1 C2 )
317 *
318  lastv = max( k, ilazlr( n, k, v, ldv ) )
319  lastc = ilazlr( m, lastv, c, ldc )
320 *
321 * W := C * V = (C1*V1 + C2*V2) (stored in WORK)
322 *
323 * W := C1
324 *
325  DO 40 j = 1, k
326  CALL zcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
327  40 CONTINUE
328 *
329 * W := W * V1
330 *
331  CALL ztrmm( 'Right', 'Lower', 'No transpose', 'Unit',
332  $ lastc, k, one, v, ldv, work, ldwork )
333  IF( lastv.GT.k ) THEN
334 *
335 * W := W + C2 * V2
336 *
337  CALL zgemm( 'No transpose', 'No transpose',
338  $ lastc, k, lastv-k,
339  $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
340  $ one, work, ldwork )
341  END IF
342 *
343 * W := W * T or W * T**H
344 *
345  CALL ztrmm( 'Right', 'Upper', trans, 'Non-unit',
346  $ lastc, k, one, t, ldt, work, ldwork )
347 *
348 * C := C - W * V**H
349 *
350  IF( lastv.GT.k ) THEN
351 *
352 * C2 := C2 - W * V2**H
353 *
354  CALL zgemm( 'No transpose', 'Conjugate transpose',
355  $ lastc, lastv-k, k,
356  $ -one, work, ldwork, v( k+1, 1 ), ldv,
357  $ one, c( 1, k+1 ), ldc )
358  END IF
359 *
360 * W := W * V1**H
361 *
362  CALL ztrmm( 'Right', 'Lower', 'Conjugate transpose',
363  $ 'Unit', lastc, k, one, v, ldv, work, ldwork )
364 *
365 * C1 := C1 - W
366 *
367  DO 60 j = 1, k
368  DO 50 i = 1, lastc
369  c( i, j ) = c( i, j ) - work( i, j )
370  50 CONTINUE
371  60 CONTINUE
372  END IF
373 *
374  ELSE
375 *
376 * Let V = ( V1 )
377 * ( V2 ) (last K rows)
378 * where V2 is unit upper triangular.
379 *
380  IF( lsame( side, 'L' ) ) THEN
381 *
382 * Form H * C or H**H * C where C = ( C1 )
383 * ( C2 )
384 *
385  lastv = max( k, ilazlr( m, k, v, ldv ) )
386  lastc = ilazlc( lastv, n, c, ldc )
387 *
388 * W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK)
389 *
390 * W := C2**H
391 *
392  DO 70 j = 1, k
393  CALL zcopy( lastc, c( lastv-k+j, 1 ), ldc,
394  $ work( 1, j ), 1 )
395  CALL zlacgv( lastc, work( 1, j ), 1 )
396  70 CONTINUE
397 *
398 * W := W * V2
399 *
400  CALL ztrmm( 'Right', 'Upper', 'No transpose', 'Unit',
401  $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
402  $ work, ldwork )
403  IF( lastv.GT.k ) THEN
404 *
405 * W := W + C1**H*V1
406 *
407  CALL zgemm( 'Conjugate transpose', 'No transpose',
408  $ lastc, k, lastv-k,
409  $ one, c, ldc, v, ldv,
410  $ one, work, ldwork )
411  END IF
412 *
413 * W := W * T**H or W * T
414 *
415  CALL ztrmm( 'Right', 'Lower', transt, 'Non-unit',
416  $ lastc, k, one, t, ldt, work, ldwork )
417 *
418 * C := C - V * W**H
419 *
420  IF( lastv.GT.k ) THEN
421 *
422 * C1 := C1 - V1 * W**H
423 *
424  CALL zgemm( 'No transpose', 'Conjugate transpose',
425  $ lastv-k, lastc, k,
426  $ -one, v, ldv, work, ldwork,
427  $ one, c, ldc )
428  END IF
429 *
430 * W := W * V2**H
431 *
432  CALL ztrmm( 'Right', 'Upper', 'Conjugate transpose',
433  $ 'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
434  $ work, ldwork )
435 *
436 * C2 := C2 - W**H
437 *
438  DO 90 j = 1, k
439  DO 80 i = 1, lastc
440  c( lastv-k+j, i ) = c( lastv-k+j, i ) -
441  $ dconjg( work( i, j ) )
442  80 CONTINUE
443  90 CONTINUE
444 *
445  ELSE IF( lsame( side, 'R' ) ) THEN
446 *
447 * Form C * H or C * H**H where C = ( C1 C2 )
448 *
449  lastv = max( k, ilazlr( n, k, v, ldv ) )
450  lastc = ilazlr( m, lastv, c, ldc )
451 *
452 * W := C * V = (C1*V1 + C2*V2) (stored in WORK)
453 *
454 * W := C2
455 *
456  DO 100 j = 1, k
457  CALL zcopy( lastc, c( 1, lastv-k+j ), 1,
458  $ work( 1, j ), 1 )
459  100 CONTINUE
460 *
461 * W := W * V2
462 *
463  CALL ztrmm( 'Right', 'Upper', 'No transpose', 'Unit',
464  $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
465  $ work, ldwork )
466  IF( lastv.GT.k ) THEN
467 *
468 * W := W + C1 * V1
469 *
470  CALL zgemm( 'No transpose', 'No transpose',
471  $ lastc, k, lastv-k,
472  $ one, c, ldc, v, ldv, one, work, ldwork )
473  END IF
474 *
475 * W := W * T or W * T**H
476 *
477  CALL ztrmm( 'Right', 'Lower', trans, 'Non-unit',
478  $ lastc, k, one, t, ldt, work, ldwork )
479 *
480 * C := C - W * V**H
481 *
482  IF( lastv.GT.k ) THEN
483 *
484 * C1 := C1 - W * V1**H
485 *
486  CALL zgemm( 'No transpose', 'Conjugate transpose',
487  $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
488  $ one, c, ldc )
489  END IF
490 *
491 * W := W * V2**H
492 *
493  CALL ztrmm( 'Right', 'Upper', 'Conjugate transpose',
494  $ 'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
495  $ work, ldwork )
496 *
497 * C2 := C2 - W
498 *
499  DO 120 j = 1, k
500  DO 110 i = 1, lastc
501  c( i, lastv-k+j ) = c( i, lastv-k+j )
502  $ - work( i, j )
503  110 CONTINUE
504  120 CONTINUE
505  END IF
506  END IF
507 *
508  ELSE IF( lsame( storev, 'R' ) ) THEN
509 *
510  IF( lsame( direct, 'F' ) ) THEN
511 *
512 * Let V = ( V1 V2 ) (V1: first K columns)
513 * where V1 is unit upper triangular.
514 *
515  IF( lsame( side, 'L' ) ) THEN
516 *
517 * Form H * C or H**H * C where C = ( C1 )
518 * ( C2 )
519 *
520  lastv = max( k, ilazlc( k, m, v, ldv ) )
521  lastc = ilazlc( lastv, n, c, ldc )
522 *
523 * W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
524 *
525 * W := C1**H
526 *
527  DO 130 j = 1, k
528  CALL zcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
529  CALL zlacgv( lastc, work( 1, j ), 1 )
530  130 CONTINUE
531 *
532 * W := W * V1**H
533 *
534  CALL ztrmm( 'Right', 'Upper', 'Conjugate transpose',
535  $ 'Unit', lastc, k, one, v, ldv, work, ldwork )
536  IF( lastv.GT.k ) THEN
537 *
538 * W := W + C2**H*V2**H
539 *
540  CALL zgemm( 'Conjugate transpose',
541  $ 'Conjugate transpose', lastc, k, lastv-k,
542  $ one, c( k+1, 1 ), ldc, v( 1, k+1 ), ldv,
543  $ one, work, ldwork )
544  END IF
545 *
546 * W := W * T**H or W * T
547 *
548  CALL ztrmm( 'Right', 'Upper', transt, 'Non-unit',
549  $ lastc, k, one, t, ldt, work, ldwork )
550 *
551 * C := C - V**H * W**H
552 *
553  IF( lastv.GT.k ) THEN
554 *
555 * C2 := C2 - V2**H * W**H
556 *
557  CALL zgemm( 'Conjugate transpose',
558  $ 'Conjugate transpose', lastv-k, lastc, k,
559  $ -one, v( 1, k+1 ), ldv, work, ldwork,
560  $ one, c( k+1, 1 ), ldc )
561  END IF
562 *
563 * W := W * V1
564 *
565  CALL ztrmm( 'Right', 'Upper', 'No transpose', 'Unit',
566  $ lastc, k, one, v, ldv, work, ldwork )
567 *
568 * C1 := C1 - W**H
569 *
570  DO 150 j = 1, k
571  DO 140 i = 1, lastc
572  c( j, i ) = c( j, i ) - dconjg( work( i, j ) )
573  140 CONTINUE
574  150 CONTINUE
575 *
576  ELSE IF( lsame( side, 'R' ) ) THEN
577 *
578 * Form C * H or C * H**H where C = ( C1 C2 )
579 *
580  lastv = max( k, ilazlc( k, n, v, ldv ) )
581  lastc = ilazlr( m, lastv, c, ldc )
582 *
583 * W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK)
584 *
585 * W := C1
586 *
587  DO 160 j = 1, k
588  CALL zcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
589  160 CONTINUE
590 *
591 * W := W * V1**H
592 *
593  CALL ztrmm( 'Right', 'Upper', 'Conjugate transpose',
594  $ 'Unit', lastc, k, one, v, ldv, work, ldwork )
595  IF( lastv.GT.k ) THEN
596 *
597 * W := W + C2 * V2**H
598 *
599  CALL zgemm( 'No transpose', 'Conjugate transpose',
600  $ lastc, k, lastv-k, one, c( 1, k+1 ), ldc,
601  $ v( 1, k+1 ), ldv, one, work, ldwork )
602  END IF
603 *
604 * W := W * T or W * T**H
605 *
606  CALL ztrmm( 'Right', 'Upper', trans, 'Non-unit',
607  $ lastc, k, one, t, ldt, work, ldwork )
608 *
609 * C := C - W * V
610 *
611  IF( lastv.GT.k ) THEN
612 *
613 * C2 := C2 - W * V2
614 *
615  CALL zgemm( 'No transpose', 'No transpose',
616  $ lastc, lastv-k, k,
617  $ -one, work, ldwork, v( 1, k+1 ), ldv,
618  $ one, c( 1, k+1 ), ldc )
619  END IF
620 *
621 * W := W * V1
622 *
623  CALL ztrmm( 'Right', 'Upper', 'No transpose', 'Unit',
624  $ lastc, k, one, v, ldv, work, ldwork )
625 *
626 * C1 := C1 - W
627 *
628  DO 180 j = 1, k
629  DO 170 i = 1, lastc
630  c( i, j ) = c( i, j ) - work( i, j )
631  170 CONTINUE
632  180 CONTINUE
633 *
634  END IF
635 *
636  ELSE
637 *
638 * Let V = ( V1 V2 ) (V2: last K columns)
639 * where V2 is unit lower triangular.
640 *
641  IF( lsame( side, 'L' ) ) THEN
642 *
643 * Form H * C or H**H * C where C = ( C1 )
644 * ( C2 )
645 *
646  lastv = max( k, ilazlc( k, m, v, ldv ) )
647  lastc = ilazlc( lastv, n, c, ldc )
648 *
649 * W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
650 *
651 * W := C2**H
652 *
653  DO 190 j = 1, k
654  CALL zcopy( lastc, c( lastv-k+j, 1 ), ldc,
655  $ work( 1, j ), 1 )
656  CALL zlacgv( lastc, work( 1, j ), 1 )
657  190 CONTINUE
658 *
659 * W := W * V2**H
660 *
661  CALL ztrmm( 'Right', 'Lower', 'Conjugate transpose',
662  $ 'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
663  $ work, ldwork )
664  IF( lastv.GT.k ) THEN
665 *
666 * W := W + C1**H * V1**H
667 *
668  CALL zgemm( 'Conjugate transpose',
669  $ 'Conjugate transpose', lastc, k, lastv-k,
670  $ one, c, ldc, v, ldv, one, work, ldwork )
671  END IF
672 *
673 * W := W * T**H or W * T
674 *
675  CALL ztrmm( 'Right', 'Lower', transt, 'Non-unit',
676  $ lastc, k, one, t, ldt, work, ldwork )
677 *
678 * C := C - V**H * W**H
679 *
680  IF( lastv.GT.k ) THEN
681 *
682 * C1 := C1 - V1**H * W**H
683 *
684  CALL zgemm( 'Conjugate transpose',
685  $ 'Conjugate transpose', lastv-k, lastc, k,
686  $ -one, v, ldv, work, ldwork, one, c, ldc )
687  END IF
688 *
689 * W := W * V2
690 *
691  CALL ztrmm( 'Right', 'Lower', 'No transpose', 'Unit',
692  $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
693  $ work, ldwork )
694 *
695 * C2 := C2 - W**H
696 *
697  DO 210 j = 1, k
698  DO 200 i = 1, lastc
699  c( lastv-k+j, i ) = c( lastv-k+j, i ) -
700  $ dconjg( work( i, j ) )
701  200 CONTINUE
702  210 CONTINUE
703 *
704  ELSE IF( lsame( side, 'R' ) ) THEN
705 *
706 * Form C * H or C * H**H where C = ( C1 C2 )
707 *
708  lastv = max( k, ilazlc( k, n, v, ldv ) )
709  lastc = ilazlr( m, lastv, c, ldc )
710 *
711 * W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK)
712 *
713 * W := C2
714 *
715  DO 220 j = 1, k
716  CALL zcopy( lastc, c( 1, lastv-k+j ), 1,
717  $ work( 1, j ), 1 )
718  220 CONTINUE
719 *
720 * W := W * V2**H
721 *
722  CALL ztrmm( 'Right', 'Lower', 'Conjugate transpose',
723  $ 'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
724  $ work, ldwork )
725  IF( lastv.GT.k ) THEN
726 *
727 * W := W + C1 * V1**H
728 *
729  CALL zgemm( 'No transpose', 'Conjugate transpose',
730  $ lastc, k, lastv-k, one, c, ldc, v, ldv, one,
731  $ work, ldwork )
732  END IF
733 *
734 * W := W * T or W * T**H
735 *
736  CALL ztrmm( 'Right', 'Lower', trans, 'Non-unit',
737  $ lastc, k, one, t, ldt, work, ldwork )
738 *
739 * C := C - W * V
740 *
741  IF( lastv.GT.k ) THEN
742 *
743 * C1 := C1 - W * V1
744 *
745  CALL zgemm( 'No transpose', 'No transpose',
746  $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
747  $ one, c, ldc )
748  END IF
749 *
750 * W := W * V2
751 *
752  CALL ztrmm( 'Right', 'Lower', 'No transpose', 'Unit',
753  $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
754  $ work, ldwork )
755 *
756 * C1 := C1 - W
757 *
758  DO 240 j = 1, k
759  DO 230 i = 1, lastc
760  c( i, lastv-k+j ) = c( i, lastv-k+j )
761  $ - work( i, j )
762  230 CONTINUE
763  240 CONTINUE
764 *
765  END IF
766 *
767  END IF
768  END IF
769 *
770  RETURN
771 *
772 * End of ZLARFB
773 *
774  END