1: SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
2: $ T, LDT, C, LDC, WORK, LDWORK )
3: IMPLICIT NONE
4: *
5: * -- LAPACK auxiliary routine (version 3.2) --
6: * -- LAPACK is a software package provided by Univ. of Tennessee, --
7: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
8: * November 2006
9: *
10: * .. Scalar Arguments ..
11: CHARACTER DIRECT, SIDE, STOREV, TRANS
12: INTEGER K, LDC, LDT, LDV, LDWORK, M, N
13: * ..
14: * .. Array Arguments ..
15: COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ),
16: $ WORK( LDWORK, * )
17: * ..
18: *
19: * Purpose
20: * =======
21: *
22: * ZLARFB applies a complex block reflector H or its transpose H' to a
23: * complex M-by-N matrix C, from either the left or the right.
24: *
25: * Arguments
26: * =========
27: *
28: * SIDE (input) CHARACTER*1
29: * = 'L': apply H or H' from the Left
30: * = 'R': apply H or H' from the Right
31: *
32: * TRANS (input) CHARACTER*1
33: * = 'N': apply H (No transpose)
34: * = 'C': apply H' (Conjugate transpose)
35: *
36: * DIRECT (input) CHARACTER*1
37: * Indicates how H is formed from a product of elementary
38: * reflectors
39: * = 'F': H = H(1) H(2) . . . H(k) (Forward)
40: * = 'B': H = H(k) . . . H(2) H(1) (Backward)
41: *
42: * STOREV (input) CHARACTER*1
43: * Indicates how the vectors which define the elementary
44: * reflectors are stored:
45: * = 'C': Columnwise
46: * = 'R': Rowwise
47: *
48: * M (input) INTEGER
49: * The number of rows of the matrix C.
50: *
51: * N (input) INTEGER
52: * The number of columns of the matrix C.
53: *
54: * K (input) INTEGER
55: * The order of the matrix T (= the number of elementary
56: * reflectors whose product defines the block reflector).
57: *
58: * V (input) COMPLEX*16 array, dimension
59: * (LDV,K) if STOREV = 'C'
60: * (LDV,M) if STOREV = 'R' and SIDE = 'L'
61: * (LDV,N) if STOREV = 'R' and SIDE = 'R'
62: * The matrix V. See further details.
63: *
64: * LDV (input) INTEGER
65: * The leading dimension of the array V.
66: * If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
67: * if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
68: * if STOREV = 'R', LDV >= K.
69: *
70: * T (input) COMPLEX*16 array, dimension (LDT,K)
71: * The triangular K-by-K matrix T in the representation of the
72: * block reflector.
73: *
74: * LDT (input) INTEGER
75: * The leading dimension of the array T. LDT >= K.
76: *
77: * C (input/output) COMPLEX*16 array, dimension (LDC,N)
78: * On entry, the M-by-N matrix C.
79: * On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
80: *
81: * LDC (input) INTEGER
82: * The leading dimension of the array C. LDC >= max(1,M).
83: *
84: * WORK (workspace) COMPLEX*16 array, dimension (LDWORK,K)
85: *
86: * LDWORK (input) INTEGER
87: * The leading dimension of the array WORK.
88: * If SIDE = 'L', LDWORK >= max(1,N);
89: * if SIDE = 'R', LDWORK >= max(1,M).
90: *
91: * =====================================================================
92: *
93: * .. Parameters ..
94: COMPLEX*16 ONE
95: PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) )
96: * ..
97: * .. Local Scalars ..
98: CHARACTER TRANST
99: INTEGER I, J, LASTV, LASTC
100: * ..
101: * .. External Functions ..
102: LOGICAL LSAME
103: INTEGER ILAZLR, ILAZLC
104: EXTERNAL LSAME, ILAZLR, ILAZLC
105: * ..
106: * .. External Subroutines ..
107: EXTERNAL ZCOPY, ZGEMM, ZLACGV, ZTRMM
108: * ..
109: * .. Intrinsic Functions ..
110: INTRINSIC DCONJG
111: * ..
112: * .. Executable Statements ..
113: *
114: * Quick return if possible
115: *
116: IF( M.LE.0 .OR. N.LE.0 )
117: $ RETURN
118: *
119: IF( LSAME( TRANS, 'N' ) ) THEN
120: TRANST = 'C'
121: ELSE
122: TRANST = 'N'
123: END IF
124: *
125: IF( LSAME( STOREV, 'C' ) ) THEN
126: *
127: IF( LSAME( DIRECT, 'F' ) ) THEN
128: *
129: * Let V = ( V1 ) (first K rows)
130: * ( V2 )
131: * where V1 is unit lower triangular.
132: *
133: IF( LSAME( SIDE, 'L' ) ) THEN
134: *
135: * Form H * C or H' * C where C = ( C1 )
136: * ( C2 )
137: *
138: LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )
139: LASTC = ILAZLC( LASTV, N, C, LDC )
140: *
141: * W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK)
142: *
143: * W := C1'
144: *
145: DO 10 J = 1, K
146: CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
147: CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
148: 10 CONTINUE
149: *
150: * W := W * V1
151: *
152: CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
153: $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
154: IF( LASTV.GT.K ) THEN
155: *
156: * W := W + C2'*V2
157: *
158: CALL ZGEMM( 'Conjugate transpose', 'No transpose',
159: $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC,
160: $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
161: END IF
162: *
163: * W := W * T' or W * T
164: *
165: CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
166: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
167: *
168: * C := C - V * W'
169: *
170: IF( M.GT.K ) THEN
171: *
172: * C2 := C2 - V2 * W'
173: *
174: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
175: $ LASTV-K, LASTC, K,
176: $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK,
177: $ ONE, C( K+1, 1 ), LDC )
178: END IF
179: *
180: * W := W * V1'
181: *
182: CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
183: $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
184: *
185: * C1 := C1 - W'
186: *
187: DO 30 J = 1, K
188: DO 20 I = 1, LASTC
189: C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
190: 20 CONTINUE
191: 30 CONTINUE
192: *
193: ELSE IF( LSAME( SIDE, 'R' ) ) THEN
194: *
195: * Form C * H or C * H' where C = ( C1 C2 )
196: *
197: LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )
198: LASTC = ILAZLR( M, LASTV, C, LDC )
199: *
200: * W := C * V = (C1*V1 + C2*V2) (stored in WORK)
201: *
202: * W := C1
203: *
204: DO 40 J = 1, K
205: CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
206: 40 CONTINUE
207: *
208: * W := W * V1
209: *
210: CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
211: $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
212: IF( LASTV.GT.K ) THEN
213: *
214: * W := W + C2 * V2
215: *
216: CALL ZGEMM( 'No transpose', 'No transpose',
217: $ LASTC, K, LASTV-K,
218: $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
219: $ ONE, WORK, LDWORK )
220: END IF
221: *
222: * W := W * T or W * T'
223: *
224: CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
225: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
226: *
227: * C := C - W * V'
228: *
229: IF( LASTV.GT.K ) THEN
230: *
231: * C2 := C2 - W * V2'
232: *
233: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
234: $ LASTC, LASTV-K, K,
235: $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV,
236: $ ONE, C( 1, K+1 ), LDC )
237: END IF
238: *
239: * W := W * V1'
240: *
241: CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
242: $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
243: *
244: * C1 := C1 - W
245: *
246: DO 60 J = 1, K
247: DO 50 I = 1, LASTC
248: C( I, J ) = C( I, J ) - WORK( I, J )
249: 50 CONTINUE
250: 60 CONTINUE
251: END IF
252: *
253: ELSE
254: *
255: * Let V = ( V1 )
256: * ( V2 ) (last K rows)
257: * where V2 is unit upper triangular.
258: *
259: IF( LSAME( SIDE, 'L' ) ) THEN
260: *
261: * Form H * C or H' * C where C = ( C1 )
262: * ( C2 )
263: *
264: LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )
265: LASTC = ILAZLC( LASTV, N, C, LDC )
266: *
267: * W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK)
268: *
269: * W := C2'
270: *
271: DO 70 J = 1, K
272: CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
273: $ WORK( 1, J ), 1 )
274: CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
275: 70 CONTINUE
276: *
277: * W := W * V2
278: *
279: CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
280: $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
281: $ WORK, LDWORK )
282: IF( LASTV.GT.K ) THEN
283: *
284: * W := W + C1'*V1
285: *
286: CALL ZGEMM( 'Conjugate transpose', 'No transpose',
287: $ LASTC, K, LASTV-K,
288: $ ONE, C, LDC, V, LDV,
289: $ ONE, WORK, LDWORK )
290: END IF
291: *
292: * W := W * T' or W * T
293: *
294: CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
295: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
296: *
297: * C := C - V * W'
298: *
299: IF( LASTV.GT.K ) THEN
300: *
301: * C1 := C1 - V1 * W'
302: *
303: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
304: $ LASTV-K, LASTC, K,
305: $ -ONE, V, LDV, WORK, LDWORK,
306: $ ONE, C, LDC )
307: END IF
308: *
309: * W := W * V2'
310: *
311: CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
312: $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
313: $ WORK, LDWORK )
314: *
315: * C2 := C2 - W'
316: *
317: DO 90 J = 1, K
318: DO 80 I = 1, LASTC
319: C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
320: $ DCONJG( WORK( I, J ) )
321: 80 CONTINUE
322: 90 CONTINUE
323: *
324: ELSE IF( LSAME( SIDE, 'R' ) ) THEN
325: *
326: * Form C * H or C * H' where C = ( C1 C2 )
327: *
328: LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )
329: LASTC = ILAZLR( M, LASTV, C, LDC )
330: *
331: * W := C * V = (C1*V1 + C2*V2) (stored in WORK)
332: *
333: * W := C2
334: *
335: DO 100 J = 1, K
336: CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,
337: $ WORK( 1, J ), 1 )
338: 100 CONTINUE
339: *
340: * W := W * V2
341: *
342: CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
343: $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
344: $ WORK, LDWORK )
345: IF( LASTV.GT.K ) THEN
346: *
347: * W := W + C1 * V1
348: *
349: CALL ZGEMM( 'No transpose', 'No transpose',
350: $ LASTC, K, LASTV-K,
351: $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
352: END IF
353: *
354: * W := W * T or W * T'
355: *
356: CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
357: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
358: *
359: * C := C - W * V'
360: *
361: IF( LASTV.GT.K ) THEN
362: *
363: * C1 := C1 - W * V1'
364: *
365: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
366: $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
367: $ ONE, C, LDC )
368: END IF
369: *
370: * W := W * V2'
371: *
372: CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
373: $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
374: $ WORK, LDWORK )
375: *
376: * C2 := C2 - W
377: *
378: DO 120 J = 1, K
379: DO 110 I = 1, LASTC
380: C( I, LASTV-K+J ) = C( I, LASTV-K+J )
381: $ - WORK( I, J )
382: 110 CONTINUE
383: 120 CONTINUE
384: END IF
385: END IF
386: *
387: ELSE IF( LSAME( STOREV, 'R' ) ) THEN
388: *
389: IF( LSAME( DIRECT, 'F' ) ) THEN
390: *
391: * Let V = ( V1 V2 ) (V1: first K columns)
392: * where V1 is unit upper triangular.
393: *
394: IF( LSAME( SIDE, 'L' ) ) THEN
395: *
396: * Form H * C or H' * C where C = ( C1 )
397: * ( C2 )
398: *
399: LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )
400: LASTC = ILAZLC( LASTV, N, C, LDC )
401: *
402: * W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK)
403: *
404: * W := C1'
405: *
406: DO 130 J = 1, K
407: CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
408: CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
409: 130 CONTINUE
410: *
411: * W := W * V1'
412: *
413: CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
414: $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
415: IF( LASTV.GT.K ) THEN
416: *
417: * W := W + C2'*V2'
418: *
419: CALL ZGEMM( 'Conjugate transpose',
420: $ 'Conjugate transpose', LASTC, K, LASTV-K,
421: $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
422: $ ONE, WORK, LDWORK )
423: END IF
424: *
425: * W := W * T' or W * T
426: *
427: CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
428: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
429: *
430: * C := C - V' * W'
431: *
432: IF( LASTV.GT.K ) THEN
433: *
434: * C2 := C2 - V2' * W'
435: *
436: CALL ZGEMM( 'Conjugate transpose',
437: $ 'Conjugate transpose', LASTV-K, LASTC, K,
438: $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
439: $ ONE, C( K+1, 1 ), LDC )
440: END IF
441: *
442: * W := W * V1
443: *
444: CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
445: $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
446: *
447: * C1 := C1 - W'
448: *
449: DO 150 J = 1, K
450: DO 140 I = 1, LASTC
451: C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
452: 140 CONTINUE
453: 150 CONTINUE
454: *
455: ELSE IF( LSAME( SIDE, 'R' ) ) THEN
456: *
457: * Form C * H or C * H' where C = ( C1 C2 )
458: *
459: LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )
460: LASTC = ILAZLR( M, LASTV, C, LDC )
461: *
462: * W := C * V' = (C1*V1' + C2*V2') (stored in WORK)
463: *
464: * W := C1
465: *
466: DO 160 J = 1, K
467: CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
468: 160 CONTINUE
469: *
470: * W := W * V1'
471: *
472: CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
473: $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
474: IF( LASTV.GT.K ) THEN
475: *
476: * W := W + C2 * V2'
477: *
478: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
479: $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC,
480: $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
481: END IF
482: *
483: * W := W * T or W * T'
484: *
485: CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
486: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
487: *
488: * C := C - W * V
489: *
490: IF( LASTV.GT.K ) THEN
491: *
492: * C2 := C2 - W * V2
493: *
494: CALL ZGEMM( 'No transpose', 'No transpose',
495: $ LASTC, LASTV-K, K,
496: $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
497: $ ONE, C( 1, K+1 ), LDC )
498: END IF
499: *
500: * W := W * V1
501: *
502: CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
503: $ LASTC, K, ONE, V, LDV, WORK, LDWORK )
504: *
505: * C1 := C1 - W
506: *
507: DO 180 J = 1, K
508: DO 170 I = 1, LASTC
509: C( I, J ) = C( I, J ) - WORK( I, J )
510: 170 CONTINUE
511: 180 CONTINUE
512: *
513: END IF
514: *
515: ELSE
516: *
517: * Let V = ( V1 V2 ) (V2: last K columns)
518: * where V2 is unit lower triangular.
519: *
520: IF( LSAME( SIDE, 'L' ) ) THEN
521: *
522: * Form H * C or H' * C where C = ( C1 )
523: * ( C2 )
524: *
525: LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )
526: LASTC = ILAZLC( LASTV, N, C, LDC )
527: *
528: * W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK)
529: *
530: * W := C2'
531: *
532: DO 190 J = 1, K
533: CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
534: $ WORK( 1, J ), 1 )
535: CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
536: 190 CONTINUE
537: *
538: * W := W * V2'
539: *
540: CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
541: $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
542: $ WORK, LDWORK )
543: IF( LASTV.GT.K ) THEN
544: *
545: * W := W + C1'*V1'
546: *
547: CALL ZGEMM( 'Conjugate transpose',
548: $ 'Conjugate transpose', LASTC, K, LASTV-K,
549: $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
550: END IF
551: *
552: * W := W * T' or W * T
553: *
554: CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
555: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
556: *
557: * C := C - V' * W'
558: *
559: IF( LASTV.GT.K ) THEN
560: *
561: * C1 := C1 - V1' * W'
562: *
563: CALL ZGEMM( 'Conjugate transpose',
564: $ 'Conjugate transpose', LASTV-K, LASTC, K,
565: $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
566: END IF
567: *
568: * W := W * V2
569: *
570: CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
571: $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
572: $ WORK, LDWORK )
573: *
574: * C2 := C2 - W'
575: *
576: DO 210 J = 1, K
577: DO 200 I = 1, LASTC
578: C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
579: $ DCONJG( WORK( I, J ) )
580: 200 CONTINUE
581: 210 CONTINUE
582: *
583: ELSE IF( LSAME( SIDE, 'R' ) ) THEN
584: *
585: * Form C * H or C * H' where C = ( C1 C2 )
586: *
587: LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )
588: LASTC = ILAZLR( M, LASTV, C, LDC )
589: *
590: * W := C * V' = (C1*V1' + C2*V2') (stored in WORK)
591: *
592: * W := C2
593: *
594: DO 220 J = 1, K
595: CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,
596: $ WORK( 1, J ), 1 )
597: 220 CONTINUE
598: *
599: * W := W * V2'
600: *
601: CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
602: $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
603: $ WORK, LDWORK )
604: IF( LASTV.GT.K ) THEN
605: *
606: * W := W + C1 * V1'
607: *
608: CALL ZGEMM( 'No transpose', 'Conjugate transpose',
609: $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE,
610: $ WORK, LDWORK )
611: END IF
612: *
613: * W := W * T or W * T'
614: *
615: CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
616: $ LASTC, K, ONE, T, LDT, WORK, LDWORK )
617: *
618: * C := C - W * V
619: *
620: IF( LASTV.GT.K ) THEN
621: *
622: * C1 := C1 - W * V1
623: *
624: CALL ZGEMM( 'No transpose', 'No transpose',
625: $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
626: $ ONE, C, LDC )
627: END IF
628: *
629: * W := W * V2
630: *
631: CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
632: $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
633: $ WORK, LDWORK )
634: *
635: * C1 := C1 - W
636: *
637: DO 240 J = 1, K
638: DO 230 I = 1, LASTC
639: C( I, LASTV-K+J ) = C( I, LASTV-K+J )
640: $ - WORK( I, J )
641: 230 CONTINUE
642: 240 CONTINUE
643: *
644: END IF
645: *
646: END IF
647: END IF
648: *
649: RETURN
650: *
651: * End of ZLARFB
652: *
653: END
CVSweb interface <joel.bertrand@systella.fr>