Annotation of rpl/lapack/lapack/zlabrd.f, revision 1.9
1.9 ! bertrand 1: *> \brief \b ZLABRD
! 2: *
! 3: * =========== DOCUMENTATION ===========
! 4: *
! 5: * Online html documentation available at
! 6: * http://www.netlib.org/lapack/explore-html/
! 7: *
! 8: *> \htmlonly
! 9: *> Download ZLABRD + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlabrd.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlabrd.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlabrd.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * SUBROUTINE ZLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
! 22: * LDY )
! 23: *
! 24: * .. Scalar Arguments ..
! 25: * INTEGER LDA, LDX, LDY, M, N, NB
! 26: * ..
! 27: * .. Array Arguments ..
! 28: * DOUBLE PRECISION D( * ), E( * )
! 29: * COMPLEX*16 A( LDA, * ), TAUP( * ), TAUQ( * ), X( LDX, * ),
! 30: * $ Y( LDY, * )
! 31: * ..
! 32: *
! 33: *
! 34: *> \par Purpose:
! 35: * =============
! 36: *>
! 37: *> \verbatim
! 38: *>
! 39: *> ZLABRD reduces the first NB rows and columns of a complex general
! 40: *> m by n matrix A to upper or lower real bidiagonal form by a unitary
! 41: *> transformation Q**H * A * P, and returns the matrices X and Y which
! 42: *> are needed to apply the transformation to the unreduced part of A.
! 43: *>
! 44: *> If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower
! 45: *> bidiagonal form.
! 46: *>
! 47: *> This is an auxiliary routine called by ZGEBRD
! 48: *> \endverbatim
! 49: *
! 50: * Arguments:
! 51: * ==========
! 52: *
! 53: *> \param[in] M
! 54: *> \verbatim
! 55: *> M is INTEGER
! 56: *> The number of rows in the matrix A.
! 57: *> \endverbatim
! 58: *>
! 59: *> \param[in] N
! 60: *> \verbatim
! 61: *> N is INTEGER
! 62: *> The number of columns in the matrix A.
! 63: *> \endverbatim
! 64: *>
! 65: *> \param[in] NB
! 66: *> \verbatim
! 67: *> NB is INTEGER
! 68: *> The number of leading rows and columns of A to be reduced.
! 69: *> \endverbatim
! 70: *>
! 71: *> \param[in,out] A
! 72: *> \verbatim
! 73: *> A is COMPLEX*16 array, dimension (LDA,N)
! 74: *> On entry, the m by n general matrix to be reduced.
! 75: *> On exit, the first NB rows and columns of the matrix are
! 76: *> overwritten; the rest of the array is unchanged.
! 77: *> If m >= n, elements on and below the diagonal in the first NB
! 78: *> columns, with the array TAUQ, represent the unitary
! 79: *> matrix Q as a product of elementary reflectors; and
! 80: *> elements above the diagonal in the first NB rows, with the
! 81: *> array TAUP, represent the unitary matrix P as a product
! 82: *> of elementary reflectors.
! 83: *> If m < n, elements below the diagonal in the first NB
! 84: *> columns, with the array TAUQ, represent the unitary
! 85: *> matrix Q as a product of elementary reflectors, and
! 86: *> elements on and above the diagonal in the first NB rows,
! 87: *> with the array TAUP, represent the unitary matrix P as
! 88: *> a product of elementary reflectors.
! 89: *> See Further Details.
! 90: *> \endverbatim
! 91: *>
! 92: *> \param[in] LDA
! 93: *> \verbatim
! 94: *> LDA is INTEGER
! 95: *> The leading dimension of the array A. LDA >= max(1,M).
! 96: *> \endverbatim
! 97: *>
! 98: *> \param[out] D
! 99: *> \verbatim
! 100: *> D is DOUBLE PRECISION array, dimension (NB)
! 101: *> The diagonal elements of the first NB rows and columns of
! 102: *> the reduced matrix. D(i) = A(i,i).
! 103: *> \endverbatim
! 104: *>
! 105: *> \param[out] E
! 106: *> \verbatim
! 107: *> E is DOUBLE PRECISION array, dimension (NB)
! 108: *> The off-diagonal elements of the first NB rows and columns of
! 109: *> the reduced matrix.
! 110: *> \endverbatim
! 111: *>
! 112: *> \param[out] TAUQ
! 113: *> \verbatim
! 114: *> TAUQ is COMPLEX*16 array dimension (NB)
! 115: *> The scalar factors of the elementary reflectors which
! 116: *> represent the unitary matrix Q. See Further Details.
! 117: *> \endverbatim
! 118: *>
! 119: *> \param[out] TAUP
! 120: *> \verbatim
! 121: *> TAUP is COMPLEX*16 array, dimension (NB)
! 122: *> The scalar factors of the elementary reflectors which
! 123: *> represent the unitary matrix P. See Further Details.
! 124: *> \endverbatim
! 125: *>
! 126: *> \param[out] X
! 127: *> \verbatim
! 128: *> X is COMPLEX*16 array, dimension (LDX,NB)
! 129: *> The m-by-nb matrix X required to update the unreduced part
! 130: *> of A.
! 131: *> \endverbatim
! 132: *>
! 133: *> \param[in] LDX
! 134: *> \verbatim
! 135: *> LDX is INTEGER
! 136: *> The leading dimension of the array X. LDX >= max(1,M).
! 137: *> \endverbatim
! 138: *>
! 139: *> \param[out] Y
! 140: *> \verbatim
! 141: *> Y is COMPLEX*16 array, dimension (LDY,NB)
! 142: *> The n-by-nb matrix Y required to update the unreduced part
! 143: *> of A.
! 144: *> \endverbatim
! 145: *>
! 146: *> \param[in] LDY
! 147: *> \verbatim
! 148: *> LDY is INTEGER
! 149: *> The leading dimension of the array Y. LDY >= max(1,N).
! 150: *> \endverbatim
! 151: *
! 152: * Authors:
! 153: * ========
! 154: *
! 155: *> \author Univ. of Tennessee
! 156: *> \author Univ. of California Berkeley
! 157: *> \author Univ. of Colorado Denver
! 158: *> \author NAG Ltd.
! 159: *
! 160: *> \date November 2011
! 161: *
! 162: *> \ingroup complex16OTHERauxiliary
! 163: *
! 164: *> \par Further Details:
! 165: * =====================
! 166: *>
! 167: *> \verbatim
! 168: *>
! 169: *> The matrices Q and P are represented as products of elementary
! 170: *> reflectors:
! 171: *>
! 172: *> Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb)
! 173: *>
! 174: *> Each H(i) and G(i) has the form:
! 175: *>
! 176: *> H(i) = I - tauq * v * v**H and G(i) = I - taup * u * u**H
! 177: *>
! 178: *> where tauq and taup are complex scalars, and v and u are complex
! 179: *> vectors.
! 180: *>
! 181: *> If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in
! 182: *> A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in
! 183: *> A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
! 184: *>
! 185: *> If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in
! 186: *> A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in
! 187: *> A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
! 188: *>
! 189: *> The elements of the vectors v and u together form the m-by-nb matrix
! 190: *> V and the nb-by-n matrix U**H which are needed, with X and Y, to apply
! 191: *> the transformation to the unreduced part of the matrix, using a block
! 192: *> update of the form: A := A - V*Y**H - X*U**H.
! 193: *>
! 194: *> The contents of A on exit are illustrated by the following examples
! 195: *> with nb = 2:
! 196: *>
! 197: *> m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n):
! 198: *>
! 199: *> ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 )
! 200: *> ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 )
! 201: *> ( v1 v2 a a a ) ( v1 1 a a a a )
! 202: *> ( v1 v2 a a a ) ( v1 v2 a a a a )
! 203: *> ( v1 v2 a a a ) ( v1 v2 a a a a )
! 204: *> ( v1 v2 a a a )
! 205: *>
! 206: *> where a denotes an element of the original matrix which is unchanged,
! 207: *> vi denotes an element of the vector defining H(i), and ui an element
! 208: *> of the vector defining G(i).
! 209: *> \endverbatim
! 210: *>
! 211: * =====================================================================
1.1 bertrand 212: SUBROUTINE ZLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
213: $ LDY )
214: *
1.9 ! bertrand 215: * -- LAPACK auxiliary routine (version 3.4.0) --
1.1 bertrand 216: * -- LAPACK is a software package provided by Univ. of Tennessee, --
217: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.9 ! bertrand 218: * November 2011
1.1 bertrand 219: *
220: * .. Scalar Arguments ..
221: INTEGER LDA, LDX, LDY, M, N, NB
222: * ..
223: * .. Array Arguments ..
224: DOUBLE PRECISION D( * ), E( * )
225: COMPLEX*16 A( LDA, * ), TAUP( * ), TAUQ( * ), X( LDX, * ),
226: $ Y( LDY, * )
227: * ..
228: *
229: * =====================================================================
230: *
231: * .. Parameters ..
232: COMPLEX*16 ZERO, ONE
233: PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ),
234: $ ONE = ( 1.0D+0, 0.0D+0 ) )
235: * ..
236: * .. Local Scalars ..
237: INTEGER I
238: COMPLEX*16 ALPHA
239: * ..
240: * .. External Subroutines ..
241: EXTERNAL ZGEMV, ZLACGV, ZLARFG, ZSCAL
242: * ..
243: * .. Intrinsic Functions ..
244: INTRINSIC MIN
245: * ..
246: * .. Executable Statements ..
247: *
248: * Quick return if possible
249: *
250: IF( M.LE.0 .OR. N.LE.0 )
251: $ RETURN
252: *
253: IF( M.GE.N ) THEN
254: *
255: * Reduce to upper bidiagonal form
256: *
257: DO 10 I = 1, NB
258: *
259: * Update A(i:m,i)
260: *
261: CALL ZLACGV( I-1, Y( I, 1 ), LDY )
262: CALL ZGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ),
263: $ LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 )
264: CALL ZLACGV( I-1, Y( I, 1 ), LDY )
265: CALL ZGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ),
266: $ LDX, A( 1, I ), 1, ONE, A( I, I ), 1 )
267: *
268: * Generate reflection Q(i) to annihilate A(i+1:m,i)
269: *
270: ALPHA = A( I, I )
271: CALL ZLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
272: $ TAUQ( I ) )
273: D( I ) = ALPHA
274: IF( I.LT.N ) THEN
275: A( I, I ) = ONE
276: *
277: * Compute Y(i+1:n,i)
278: *
279: CALL ZGEMV( 'Conjugate transpose', M-I+1, N-I, ONE,
280: $ A( I, I+1 ), LDA, A( I, I ), 1, ZERO,
281: $ Y( I+1, I ), 1 )
282: CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
283: $ A( I, 1 ), LDA, A( I, I ), 1, ZERO,
284: $ Y( 1, I ), 1 )
285: CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
286: $ LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
287: CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
288: $ X( I, 1 ), LDX, A( I, I ), 1, ZERO,
289: $ Y( 1, I ), 1 )
290: CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
291: $ A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
292: $ Y( I+1, I ), 1 )
293: CALL ZSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
294: *
295: * Update A(i,i+1:n)
296: *
297: CALL ZLACGV( N-I, A( I, I+1 ), LDA )
298: CALL ZLACGV( I, A( I, 1 ), LDA )
299: CALL ZGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ),
300: $ LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA )
301: CALL ZLACGV( I, A( I, 1 ), LDA )
302: CALL ZLACGV( I-1, X( I, 1 ), LDX )
303: CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
304: $ A( 1, I+1 ), LDA, X( I, 1 ), LDX, ONE,
305: $ A( I, I+1 ), LDA )
306: CALL ZLACGV( I-1, X( I, 1 ), LDX )
307: *
308: * Generate reflection P(i) to annihilate A(i,i+2:n)
309: *
310: ALPHA = A( I, I+1 )
311: CALL ZLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ), LDA,
312: $ TAUP( I ) )
313: E( I ) = ALPHA
314: A( I, I+1 ) = ONE
315: *
316: * Compute X(i+1:m,i)
317: *
318: CALL ZGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
319: $ LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
320: CALL ZGEMV( 'Conjugate transpose', N-I, I, ONE,
321: $ Y( I+1, 1 ), LDY, A( I, I+1 ), LDA, ZERO,
322: $ X( 1, I ), 1 )
323: CALL ZGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
324: $ LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
325: CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
326: $ LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
327: CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
328: $ LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
329: CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
330: CALL ZLACGV( N-I, A( I, I+1 ), LDA )
331: END IF
332: 10 CONTINUE
333: ELSE
334: *
335: * Reduce to lower bidiagonal form
336: *
337: DO 20 I = 1, NB
338: *
339: * Update A(i,i:n)
340: *
341: CALL ZLACGV( N-I+1, A( I, I ), LDA )
342: CALL ZLACGV( I-1, A( I, 1 ), LDA )
343: CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ),
344: $ LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA )
345: CALL ZLACGV( I-1, A( I, 1 ), LDA )
346: CALL ZLACGV( I-1, X( I, 1 ), LDX )
347: CALL ZGEMV( 'Conjugate transpose', I-1, N-I+1, -ONE,
348: $ A( 1, I ), LDA, X( I, 1 ), LDX, ONE, A( I, I ),
349: $ LDA )
350: CALL ZLACGV( I-1, X( I, 1 ), LDX )
351: *
352: * Generate reflection P(i) to annihilate A(i,i+1:n)
353: *
354: ALPHA = A( I, I )
355: CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
356: $ TAUP( I ) )
357: D( I ) = ALPHA
358: IF( I.LT.M ) THEN
359: A( I, I ) = ONE
360: *
361: * Compute X(i+1:m,i)
362: *
363: CALL ZGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
364: $ LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
365: CALL ZGEMV( 'Conjugate transpose', N-I+1, I-1, ONE,
366: $ Y( I, 1 ), LDY, A( I, I ), LDA, ZERO,
367: $ X( 1, I ), 1 )
368: CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
369: $ LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
370: CALL ZGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
371: $ LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
372: CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
373: $ LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
374: CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
375: CALL ZLACGV( N-I+1, A( I, I ), LDA )
376: *
377: * Update A(i+1:m,i)
378: *
379: CALL ZLACGV( I-1, Y( I, 1 ), LDY )
380: CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
381: $ LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
382: CALL ZLACGV( I-1, Y( I, 1 ), LDY )
383: CALL ZGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
384: $ LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
385: *
386: * Generate reflection Q(i) to annihilate A(i+2:m,i)
387: *
388: ALPHA = A( I+1, I )
389: CALL ZLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
390: $ TAUQ( I ) )
391: E( I ) = ALPHA
392: A( I+1, I ) = ONE
393: *
394: * Compute Y(i+1:n,i)
395: *
396: CALL ZGEMV( 'Conjugate transpose', M-I, N-I, ONE,
397: $ A( I+1, I+1 ), LDA, A( I+1, I ), 1, ZERO,
398: $ Y( I+1, I ), 1 )
399: CALL ZGEMV( 'Conjugate transpose', M-I, I-1, ONE,
400: $ A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
401: $ Y( 1, I ), 1 )
402: CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
403: $ LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
404: CALL ZGEMV( 'Conjugate transpose', M-I, I, ONE,
405: $ X( I+1, 1 ), LDX, A( I+1, I ), 1, ZERO,
406: $ Y( 1, I ), 1 )
407: CALL ZGEMV( 'Conjugate transpose', I, N-I, -ONE,
408: $ A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
409: $ Y( I+1, I ), 1 )
410: CALL ZSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
411: ELSE
412: CALL ZLACGV( N-I+1, A( I, I ), LDA )
413: END IF
414: 20 CONTINUE
415: END IF
416: RETURN
417: *
418: * End of ZLABRD
419: *
420: END
CVSweb interface <joel.bertrand@systella.fr>